Conversione di un ArrayAdapter in CursorAdapter per l’uso in un SearchView

Come posso convertire un ArrayAdapter di dati statici in un CursorAdapter per l’uso di Listener di suggerimenti in SearchView ? Ho costruito ArrayAdapter da dati statici ( allString )

 ArrayAdapter searchAdapter = new ArrayAdapter(context, R.layout.listitem, allString); 

e io lo uso per un MultiAutoCompleteTextView che funziona bene in dispositivi con livello API inferiore a 11

 MultiAutoCompleteTextView findTextView.setAdapter(searchAdapter); 

Tuttavia la mia API di destinazione è di livello 11 e per API> 10 utilizzo un ActionBar all’interno del quale vorrei avere un SearchView.

Ecco cosa ho provato: mostra ActionBar con SearchView incorporato ma non fornisce suggerimenti come nel MultiAutoCompleteTextView .

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); if (android.os.Build.VERSION.SDK_INT > 10){ inflater.inflate(R.menu.menu11, menu); searchView = (SearchView) menu.findItem(R.id.MENU_SEARCH).getActionView(); int[] to = {0}; CursorAdapter cursorAdapter = new SimpleCursorAdapter(context, R.layout.listitem, null, allBusStopString, to); searchView.setSuggestionsAdapter(cursorAdapter); searchView.setOnSuggestionListener(new OnSuggestionListener() { @Override public boolean onSuggestionClick(int position) { String selectedItem = (String)cursorAdapter.getItem(position); Log.v("search view", selectedItem); return false; } @Override public boolean onSuggestionSelect(int position) { return false; } }); }else{ inflater.inflate(R.menu.menu, menu); } return true; } 

È strano SearchView.setSuggestionsAdapter accetta solo CursorAdapter.

È ansible creare MatrixCursor e riempirlo con i dati dell’array String. Spero che tu abbia una piccola raccolta di dati.

Quindi passare il cursore su 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); 

Stavo affrontando un problema simile. Puoi utilizzare SearchView.setSuggestionsAdapter () che accetta solo CursorAdapter . D’altra parte … qual è il punto? Se si utilizza lo standard allora contiene SearchAutoComplete che estende AppCompatAutoCompleteTextView all’interno. Il codice seguente ha funzionato per me:

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

e il seguente codice dell’adattatore:

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