Implementando SearchView en la barra de acciones

Necesito crear SearchView desde mi arrayList y mostrar las sugerencias en la lista desplegable misma esta

enter image description here

Busco tutoriales que explican paso a paso cómo construir un SearchView en una barra de acciones.

He leído la documentación y seguido el ejemplo de google, pero no fue útil para mí.

He creado la búsqueda

    ` 

Pero no sé cómo configurar los parámetros de la matriz de cadenas. Traté de recuperar el resultado en una actividad diferente pero no funcionó.

Tomó un tiempo armar una solución para esto, pero descubrieron que esta es la forma más fácil de hacer que funcione de la manera que usted describe. Podría haber mejores formas de hacerlo, pero como no ha publicado su código de actividad, tendré que improvisar y asumir que tiene una lista como esta al comienzo de su actividad:

 private List items = db.getItems(); 

ExampleActivity.java

 private List items; private Menu menu; @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.example, menu); this.menu = menu; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView search = (SearchView) menu.findItem(R.id.search).getActionView(); search.setSearchableInfo(manager.getSearchableInfo(getComponentName())); search.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextChange(String query) { loadHistory(query); return true; } }); } return true; } // History @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void loadHistory(String query) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Cursor String[] columns = new String[] { "_id", "text" }; Object[] temp = new Object[] { 0, "default" }; MatrixCursor cursor = new MatrixCursor(columns); for(int i = 0; i < items.size(); i++) { temp[0] = i; temp[1] = items.get(i);replaced s with i as s not used anywhere. cursor.addRow(temp); } // SearchView SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final SearchView search = (SearchView) menu.findItem(R.id.search).getActionView(); search.setSuggestionsAdapter(new ExampleAdapter(this, cursor, items)); } } 

Ahora necesita crear un adaptador extendido desde CursorAdapter :

ExampleAdapter.java

 public class ExampleAdapter extends CursorAdapter { private List items; private TextView text; public ExampleAdapter(Context context, Cursor cursor, List items) { super(context, cursor, false); this.items = items; } @Override public void bindView(View view, Context context, Cursor cursor) { text.setText(items.get(cursor.getPosition())); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.item, parent, false); text = (TextView) view.findViewById(R.id.text); return view; } } 

Una mejor forma de hacerlo es si los datos de su lista provienen de una base de datos, puede pasar el Cursor devuelto por las funciones de la base de datos directamente a ExampleAdapter y usar el selector de columna relevante para mostrar el texto de la columna en el TextView al que se TextView referencia en el adaptador.

Tenga en cuenta que cuando importe CursorAdapter no importe la versión de soporte de Android, importe el android.widget.CursorAdapter estándar en su lugar.

El adaptador también requerirá un diseño personalizado:

res / layout / item.xml

    

Ahora puede personalizar los elementos de la lista agregando texto adicional o vistas de imágenes al diseño y rellenándolos con datos en el adaptador.

Esto debería ser todo, pero si aún no lo ha hecho, necesita un elemento del menú SearchView:

res / menu / example.xml

    

Luego crea una configuración de búsqueda:

res / xml / searchable.xml

   

Finalmente agregue esto dentro de la etiqueta de actividad relevante en el archivo de manifiesto:

AndroidManifest.xml

      

Tenga en cuenta: la @string/search string utilizada en los ejemplos debe definirse en values ​​/ strings.xml , tampoco olvide actualizar la referencia a com.example para su proyecto.

Si alguien más tiene nullptr en la variable de búsqueda, descubrí que la configuración del elemento es un poco diferente:

antiguo:

 android:showAsAction="ifRoom" android:actionViewClass="android.widget.SearchView" 

nuevo:

 app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView" 

Para obtener más información, la documentación actualizada se encuentra aquí .

 *** For serachview use these code --------------- 1. For XML   *** 2. In your Fragment or Activity package com.example.user.salaryin; import android.app.ProgressDialog; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.example.user.salaryin.Adapter.BusinessModuleAdapter; import com.example.user.salaryin.Network.ApiClient; import com.example.user.salaryin.POJO.ProductDetailPojo; import com.example.user.salaryin.Service.ServiceAPI; import java.util.ArrayList; import java.util.List; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; /** * Created by USer on 24-08-2017. */ public class OneFragment extends Fragment implements SearchView.OnQueryTextListener { RecyclerView recyclerView; RecyclerView.LayoutManager layoutManager; ArrayList arrayList; BusinessModuleAdapter adapter; private ProgressDialog pDialog; GridLayoutManager gridLayoutManager; SearchView searchView; public OneFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.one_fragment,container,false); pDialog = new ProgressDialog(getActivity()); pDialog.setMessage("Please wait..."); searchView=(SearchView)rootView.findViewById(R.id.searchView); searchView.setQueryHint("Search BY Brand"); searchView.setOnQueryTextListener(this); recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView); layoutManager = new LinearLayoutManager(this.getActivity()); recyclerView.setLayoutManager(layoutManager); gridLayoutManager = new GridLayoutManager(this.getActivity().getApplicationContext(), 2); recyclerView.setLayoutManager(gridLayoutManager); recyclerView.setHasFixedSize(true); getImageData(); // Inflate the layout for this fragment //return inflater.inflate(R.layout.one_fragment, container, false); return rootView; } private void getImageData() { pDialog.show(); ServiceAPI service = ApiClient.getRetrofit().create(ServiceAPI.class); Call> call = service.getBusinessImage(); call.enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { if (response.isSuccessful()) { arrayList = (ArrayList) response.body(); adapter = new BusinessModuleAdapter(arrayList, getActivity()); recyclerView.setAdapter(adapter); pDialog.dismiss(); } else if (response.code() == 401) { pDialog.dismiss(); Toast.makeText(getActivity(), "Data is not found", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call> call, Throwable t) { Toast.makeText(getActivity(), t.getMessage(), Toast.LENGTH_SHORT).show(); pDialog.dismiss(); } }); } /* @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { getActivity().getMenuInflater().inflate(R.menu.menu_search, menu); MenuItem menuItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem); searchView.setQueryHint("Search Product"); searchView.setOnQueryTextListener(this); }*/ @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { newText = newText.toLowerCase(); ArrayList newList = new ArrayList<>(); for (ProductDetailPojo productDetailPojo : arrayList) { String name = productDetailPojo.getDetails().toLowerCase(); if (name.contains(newText) ) newList.add(productDetailPojo); } adapter.setFilter(newList); return true; } } 3. In adapter class public void setFilter(List newList){ arrayList=new ArrayList<>(); arrayList.addAll(newList); notifyDataSetChanged(); }