tipos studio restricciones que personalizado example cursorloader adaptador android android-actionbar simplecursoradapter autocompletetextview android-cursoradapter

android - studio - simplecursoradapter restricciones



Convertir un ArrayAdapter en CursorAdapter para usar en un SearchView (2)

Es extraño que SearchView.setSuggestionsAdapter solo acepte CursorAdapter.

Puede crear MatrixCursor y rellenarlo con datos de la matriz de cadenas. Espero que tengas poca recopilación de datos.

Luego pasa el cursor a 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);

¿Cómo puedo convertir un ArrayAdapter<String> de datos estáticos en un CursorAdapter para usar la escucha de sugerencias en SearchView ? He construido el ArrayAdapter<String> partir de datos estáticos ( allString )

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

y lo uso para un MultiAutoCompleteTextView que funciona bien en dispositivos con un nivel de API inferior a 11

MultiAutoCompleteTextView findTextView.setAdapter(searchAdapter);

Sin embargo, mi API objetivo es el nivel 11 y para API> 10 uso una ActionBar dentro de la cual me gustaría tener un SearchView en su lugar.

Esto es lo que he intentado: muestra la ActionBar con ActionBar incorporado pero no da ninguna sugerencia como lo haría en 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; }


Me enfrentaba a un problema similar. Puede usar SearchView.setSuggestionsAdapter () que solo acepta CursorAdapter . Por otro lado ... ¿cuál es el punto? Si utiliza el estándar <android.support.v7.widget.SearchView /> entonces contiene SearchAutoComplete que extiende AppCompatAutoCompleteTextView dentro. El siguiente código funcionó para mí:

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

y el siguiente código de adaptador:

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