Converting an ArrayAdapter to CursorAdapter for use in a SearchView

后端 未结 2 1303
终归单人心
终归单人心 2020-12-12 20:01

How can I convert an ArrayAdapter of static data into a CursorAdapter for using Suggestion Listener in SearchView? I h

2条回答
  •  被撕碎了的回忆
    2020-12-12 20:20

    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();
                }
            }
        }
    }
    

提交回复
热议问题