Converting an ArrayAdapter to CursorAdapter for use in a SearchView

后端 未结 2 1288
终归单人心
终归单人心 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 <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", "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<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();
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-12 20:30

    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 resources
    String[] 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);
    
    0 讨论(0)
提交回复
热议问题