studio recyclerview metodo how example ejemplo campo busqueda buscar buscador bar android autocomplete searchview

recyclerview - searchview android example listview



Las sugerencias de SearchView no se muestran para un solo carácter escrito (3)

Estoy trabajando en una aplicación para Android escrita en Scala que usa android.support.v7.widget.SearchView dentro de la barra de acción que android.support.v7.widget.Toolbar reemplaza.

En la aplicación, necesito habilitar las sugerencias de búsqueda para ese SearchView . Por lo tanto, cada vez que detecto un cambio de consulta, verifico si es necesario actualizar las sugerencias (código a continuación). Si es necesario actualizar las sugerencias, se realiza una llamada al backend y se crea una base de datos android.database.MatrixCursor que contiene las sugerencias de búsqueda y se establece en el adaptador de sugerencias de SearchView (código a continuación).

El problema que tengo con esto es que las sugerencias de búsqueda no se mostrarán al escribir un solo carácter. Escribir dos o más caracteres en el cuadro de búsqueda funciona perfectamente.

He intentado con android:searchSuggestThreshold establecido en 0 y 1 en mi configuración XML y obtengo el mismo resultado (al igual que se ignora esa opción): sugerencias de búsqueda que muestran varios caracteres de entrada, pero no para un solo carácter.

¿Me falta algo en la configuración / inicialización de SearchView ? Como una opción distinta de android:searchSuggestThreshold cuál puedo configurar? He pasado las últimas horas buscando opciones alternativas, pero no pude encontrar ninguna.

Una posible solución que veo sería conseguir que AutoCompleteTextView respalde la entrada de SearchView y establezca el umbral para que sea 1, pero es una solución fea (hack-ish) ya que el AutoCompleteTextView no está expuesto por la API de SearchView .

¿Alguien sabe una solución elegante para esto?

¡Gracias!

Detectando cambios en los términos de búsqueda:

//this gets called whenever something is changed in the search box. "s" contains the entire search term typed in the search box def onQueryTextChange(s: String): Boolean = { //this checks to see if a call should be made to the backend to update suggestions SearchSuggestionController.query(s) //return false as we''re not consuming the event false }

Actualizando sugerencias de búsqueda:

def updateSuggestions(suggestions: Array[String]): Unit = { val cursor = new MatrixCursor(Array(BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1), suggestions.length) for{ i <- suggestions.indices s = suggestions(i) } cursor.addRow(Array[AnyRef](i.toString, s)) getActivity.runOnUiThread(() => { searchSuggestionAdapter.changeCursor(cursor) searchSuggestionAdapter.notifyDataSetChanged() }) }

Menú SearchView inicialización:

override def onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) = { inflater.inflate(R.menu.menu_products, menu) val searchManager = getActivity.getSystemService(Context.SEARCH_SERVICE).asInstanceOf[SearchManager] val actionItem = menu.findItem(R.id.action_search) searchView = MenuItemCompat.getActionView(actionItem).asInstanceOf[SearchView] searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity.getComponentName)) searchView.setSubmitButtonEnabled(false) SearchSuggestionController.onSuggestionsProvided_=(updateSuggestions) searchView setSuggestionsAdapter searchSuggestionAdapter searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { //... //change listener for detecting search changes presented above //... } //... //initialise other components //... }

Configuración de búsqueda:

<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/actionbar_products_search_hint" android:searchSuggestThreshold="0" android:searchSuggestSelection=" ?"/>


Debe manejar el objeto SearchAutoComplete que usa el objeto SearchView, luego establecer pragmáticamente su umbral en 1. (si intenta establecerlo en 0, se convertirá en 1, se implementará así detrás de la escena) desafortunadamente no funcionará desde XML para alguna razón.

SearchView.SearchAutoComplete mSearchSrcTextView = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); // show results from 1 char mSearchSrcTextView.setThreshold(1);


Establezca un OnQueryTextListener en su SearchView. Utilice su onQueryTextChange para actualizar su adaptador.


Veo su punto de vista sobre la "solución elegante", lo cual es muy bueno, pero me temo que la API de Android lo obligará muchas veces a hacer "no elegante" de todos modos si quiere alcanzar sus objetivos :)

No conozco una solución alternativa con la configuración del umbral directamente en AutoCompleteTextView pero si no es así, le sugiero que realice un paso ( no muy bueno ) más que podría funcionar:

Obtener instancia de EditText:

AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);

Y la fuerza para mostrar sugerencias en onQueryTextChange para la longitud del texto es igual a 1:

if(s.length() == 1){ searchText.showDropDown(); {