Converting an ArrayAdapter to CursorAdapter for use in a SearchView
That's strange SearchView.setSuggestionsAdapter
accepts CursorAdapter only.
You could create MatrixCursor and fill it with data from String array. I hope you have small data collection.
Then pass the cursor to CursorAdapter.
String[] columnNames = {"_id","text"}MatrixCursor cursor = new MatrixCursor(columnNames);String[] array = getResources().getStringArray(R.array.allStrings); //if strings are in resourcesString[] temp = new String[2];int id = 0;for(String item : array){ temp[0] = Integer.toString(id++); temp[1] = item; cursor.addRow(temp);} String[] from = {"text"}; int[] to = {R.id.name_entry};busStopCursorAdapter = new SimpleCursorAdapter(context, R.layout.listentry, cursor, from, to);
I was facing similar problem. You can use SearchView.setSuggestionsAdapter() which only accepts CursorAdapter. On the other hand... what's the point? If you use the standard <android.support.v7.widget.SearchView />
then it contains SearchAutoComplete which extends AppCompatAutoCompleteTextView inside. The following code worked for me:
List<String> items = Lists.newArrayList(new String[] {"aaaaa", "bbbbb", "ccccc", "ddddd"});SearchView searchView = (SearchView) findViewById(R.id.autocomplete_searchview);SearchView.SearchAutoComplete searchSrcTextView = (SearchView.SearchAutoComplete) findViewById(android.support.v7.appcompat.R.id.search_src_text);searchSrcTextView.setThreshold(1);searchSrcTextView.setAdapter(new SuggestionAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items));searchSrcTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { return; }});
and the following Adapter code:
public class SuggestionAdapter<T> extends ArrayAdapter<T> { private List<T> items; private List<T> filteredItems; private ArrayFilter mFilter; public SuggestionAdapter(Context context, @LayoutRes int resource, @NonNull List<T> objects) { super(context, resource, Lists.<T>newArrayList()); this.items = objects; } @Override public long getItemId(int position) { return position; } @Override public T getItem(int position) { return items.get(position); } @Override public Filter getFilter() { if (mFilter == null) { mFilter = new ArrayFilter(); } return mFilter; } public int getCount() { //todo: change to pattern-size return items.size(); } private class ArrayFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence prefix) { FilterResults results = new FilterResults(); //custom-filtering of results results.values = items; results.count = items.size(); return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { filteredItems = (List<T>) results.values; if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } }}