Cómo usar SearchView en la barra de herramientas de Android

El código en el que estoy trabajando es el uso de una Toolbar e inflar un menu .

Aquí está el código

 private Toolbar mToolbar; mToolbar.inflateMenu(R.menu.chat_screen_menu); setupMenu (); private void setupMenu () { mMenu = mToolbar.getMenu(); if (mMenu != null) { if (mChatPager != null && mChatPager.getCurrentItem() > 0) { mMenu.setGroupVisible(R.id.menu_group_chats, true); mMenu.setGroupVisible(R.id.menu_group_contacts, false); } else { mMenu.setGroupVisible(R.id.menu_group_chats, false); mMenu.setGroupVisible(R.id.menu_group_contacts, true); mMenu.setGroupVisible(R.id.menu_group_otr_verified,false); mMenu.setGroupVisible(R.id.menu_group_otr_unverified,false); mMenu.setGroupVisible(R.id.menu_group_otr_off,false); } } mToolbar.setOnMenuItemClickListener(new OnMenuItemClickListener () { .......... } } 

Pero ahora, requieren un botón de Search en la tool_bar . Me las arreglé para decirlo, seguí una guía aquí. Cuando bash escribir algo para buscar, el brindis que puse a prueba nunca fue mostrado por el listener . que indica que el listener no está funcionando

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.chat_screen_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_menu_search)); final Toast toast = new Toast(mApp); if (mSearchView != null ) { mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); mSearchView.setIconifiedByDefault(false); SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { public boolean onQueryTextChange(String newText) { mSearchString = newText; //doFilterAsync(mSearchString); toast.makeText(getApplicationContext(), "Test1", Toast.LENGTH_LONG).show(); return true; } public boolean onQueryTextSubmit(String query) { mSearchString = query; //doFilterAsync(mSearchString); toast.makeText(getApplicationContext(), "Test2", Toast.LENGTH_LONG).show(); return true; } }; mSearchView.setOnQueryTextListener(queryTextListener); } return true; } 

Tienes que usar la biblioteca de Appcompat para eso. Que se usa a continuación:

dashboard.xml

    

Archivo de actividad:

 public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.dashboard, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE); SearchView searchView = null; if (searchItem != null) { searchView = (SearchView) searchItem.getActionView(); } if (searchView != null) { searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName())); } return super.onCreateOptionsMenu(menu); } 

archivo manifiesto

           

archivo XML buscable:

   

Y, por último, su código de clase SearchResultsActivity . para mostrar el resultado de tu búsqueda.

Si desea configurar el servicio de búsqueda dentro de su Fragment , simplemente agregue estas pocas líneas:

Paso 1 – Agregue el campo de búsqueda a su toolbar :

  

Paso 2 : agrega la lógica a tu onCreateOptionsMenu()

 import android.support.v7.widget.SearchView; // not the default ! @Override public boolean onCreateOptionsMenu( Menu menu) { getMenuInflater().inflate( R.menu.main, menu); MenuItem myActionMenuItem = menu.findItem( R.id.action_search); searchView = (SearchView) myActionMenuItem.getActionView(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { // Toast like print UserFeedback.show( "SearchOnQueryTextSubmit: " + query); if( ! searchView.isIconified()) { searchView.setIconified(true); } myActionMenuItem.collapseActionView(); return false; } @Override public boolean onQueryTextChange(String s) { // UserFeedback.show( "SearchOnQueryTextChanged: " + s); return false; } }); return true; } 

Si desea agregarlo directamente en la barra de herramientas.

       

Integración de SearchView con RecyclerView

1) Agregue el elemento SearchView en el menú

SearchView se puede agregar como actionView en el menú usando

aplicación: useActionClass = “android.support.v7.widget.SearchView”.

    

2) Implementa SearchView.OnQueryTextListener en tu actividad

SearchView.OnQueryTextListener tiene dos métodos abstractos. Entonces, su esqueleto de actividad ahora se vería así después de implementar el detector de texto SearchView.

 YourActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{ public boolean onQueryTextSubmit(String query) public boolean onQueryTextChange(String newText) } 

3) Configure el texto de SerchView Hint, el oyente, etc.

 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); MenuItem searchItem = menu.findItem(R.id.searchBar); SearchView searchView = (SearchView) searchItem.getActionView(); searchView.setQueryHint("Search People"); searchView.setOnQueryTextListener(this); searchView.setIconified(false); return true; } 

4) Implementar SearchView.OnQueryTextListener

Así es como puede implementar métodos abstractos del oyente.

 @Override public boolean onQueryTextSubmit(String query) { // This method can be used when query is submitted eg. creatting search history using SQLite DB Toast.makeText(this, "Query Inserted", Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onQueryTextChange(String newText) { adapter.filter(newText); return true; } 

5) Escriba un método de filtro en su adaptador RecyclerView.

Puede proponer su propia lógica en función de sus necesidades. Aquí está el fragmento de código de muestra para mostrar la lista de Nombre que contiene el texto escrito en SearchView .

 public void filter(String queryText) { list.clear(); if(queryText.isEmpty()) { list.addAll(copyList); } else { for(String name: copyList) { if(name.toLowerCase().contains(queryText.toLowerCase())) { list.add(name); } } } notifyDataSetChanged(); } 

Muestra de código de trabajo completo se puede encontrar> AQUÍ
También puede consultar el código en SearchView con una base de datos SQLite en esta aplicación de música