Mostrar sugerencias para un vacío SearchView

Tengo un widget SearchView en mi barra de acción que muestra los términos de búsqueda sugeridos correctos cuando el usuario introduce uno o más caracteres.

También me gustaría mostrar una lista (diferente) de sugerencias cuando el SearchView está vacío, incluso antes de que el usuario haya ingresado cualquier texto.

Hasta el momento está funcionando correctamente cuando el usuario ingresa texto y luego elimina ese texto, y cuando el usuario pulsa el icono de búsqueda para abrir el widget y, a continuación, pulsa en el widget de búsqueda una vez que se abra. Para hacer esto, estoy usando un OnQueryTextListener así:

 class SearchTextEnteredListener implements SearchView.OnQueryTextListener { @Override public boolean onQueryTextChange(String newText) { if (newText.length() > 1) { // Set normal suggestions CursorAdapter searchadapter = new SearchSuggestionsAdapter(mContext, suggestions); mSearchView.setSuggestionsAdapter(searchadapter); } else if (newText.length() == 1) { // Clear the displayed suggestions if(searchadapter != null && mSearchView != null){ searchadapter.createAndChangeCursor(null); } } else { // Length = 0, show other suggestions CursorAdapter searchadapter = new SearchSuggestionsAdapter(mContext, otherSuggestions); mSearchView.setSuggestionsAdapter(searchadapter); } return false; } } 

Sin embargo, me gustaría que las sugerencias de popup tan pronto como se abre el widget de búsqueda, en lugar de requerir un segundo toque como lo hace ahora. No he tenido suerte conseguir que lo haga.

Incluso he intentado encontrar manualmente el AutoCompleteTextView showDropDown() y llamar a showDropDown() cuando el SearchView obtiene el foco (ver abajo), pero que no muestra el desplegable tampoco.

 mSearchView.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { int autoCompleteId = mContext.getResources().getIdentifier("android:id/search_src_text", null, null); if (autoCompleteId == 0) { // We won't be able to find the view. Give up. return; } AutoCompleteTextView autoCompleteView = (AutoCompleteTextView) mSearchView.findViewById(autoCompleteId); if (autoCompleteView != null) { autoCompleteView.showDropDown(); } } } }); 

¿Cómo puedo desplegar las sugerencias de búsqueda cuando se abre el widget de búsqueda?

Es posible. Estoy utilizando el compat v7 SearchView y Cursor Loaders para consultar en armonía con el ciclo de vida de la actividad.

 // eg in onCreateView in my Fragment, wire up the SearchView: MenuItem searchMenuItem = toolbar.getMenu().findItem(R.id.search_menu_item); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); // and setup listeners (implementation is shown later) searchView.setOnSuggestionListener(this); searchView.setOnQueryTextListener(this); searchView.setOnCloseListener(this); // then raid the SearchView so search begins on 0 chars! AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); autoCompleteTextView.setThreshold(0); // and set the suggestions adapter so we can use a Loader to do the queries SuggestionCursorAdapter suggestionCursorAdapter = new SuggestionCursorAdapter(getContext(), null, 0); searchView.setSuggestionsAdapter(suggestionAdapter); 

Aquí están las implementaciones de los oyentes:

 @Override public boolean onQueryTextChange(String userInput) { if (TextUtils.isEmpty(userInput.trim())) { Log.d(TAG, "onQueryTextChange: empty userInput"); // The argument to the loader is null so your query should return all suggestions getLoaderManager().restartLoader(SEARCH_VIEW_LOADER_ID, null, this); return true; } userInput = userInput.trim(); Bundle args = new Bundle(); args.putString("USER_INPUT", userInput); // The argument contains the users input so your query should use a LIKE to find matching suggestions getLoaderManager().restartLoader(SEARCH_VIEW_LOADER_ID, args, this); return true; } @Override public boolean onQueryTextSubmit(String query) { return true; } @Override public boolean onClose() { return false; } @Override public boolean onSuggestionSelect(int position) { return false; } @Override public boolean onSuggestionClick(int position) { Cursor c = searchView.getSuggestionsAdapter().getCursor(); final String suggestion = c.getString(c.getColumnIndex("some_column_name")); Log.d(TAG, "onSuggestionClick: position: " + position + " suggestion: " + suggestion); return true; } 

Un detalle adicional, mi SuggestionCursorAdapter extiende CursorAdaptor y reemplaza el siguiente método para evitar: java.lang.IllegalStateException: intenta volver a abrir un objeto ya cerrado: SQLiteQuery

 @Override public void changeCursor(Cursor newCursor) { newCursor.close(); } 

Fue un dolor para trabajar, así que espero que ayuda a alguien!

  • Escala adaptarse a contenido web móvil utilizando meta tag de vista
  • Cómo obtener la entrada de searchview a textview
  • Android: ¿Proporciona sugerencias de búsqueda recientes sin actividad de búsqueda?
  • Convertir vista a mapa de bits en Android
  • Ocultar el teclado después de que un usuario termine una consulta en un SearchView
  • Obtener referencias a las vistas en mi actividad de Android
  • Obtener eventos táctiles en un diálogo que se muestra mientras el dedo ya estaba tocando la pantalla
  • Cómo obtener NoSuchMethodError con métodos TextView
  • ¿Qué hace android: isScrollContainer hacer?
  • No se puede resolver el símbolo 'NavigationView'
  • Android searchVer no en actionBar eliminar foco
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.