How can I convert an ArrayAdapter of static data into a CursorAdapter for using Suggestion Listener in SearchView?
I h
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 then it contains SearchAutoComplete which extends AppCompatAutoCompleteTextView inside. The following code worked for me:
List items = Lists.newArrayList(new String[] {"aaaaa", "bbbbb", "ccccc", "ffffffffd"});
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(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 extends ArrayAdapter {
private List items;
private List filteredItems;
private ArrayFilter mFilter;
public SuggestionAdapter(Context context, @LayoutRes int resource, @NonNull List objects) {
super(context, resource, Lists.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) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
}