Android – Implementación del filtro de búsqueda en un RecyclerView

Tengo que implementar una función de búsqueda basada en un EditText a mi RecyclerView la lista debe ser filtrada mientras typng

Aquí está el código:

DisplayAdapter.java este es el adaptador

public class DisplayAdapter extends RecyclerView.Adapter<DisplayAdapter.MyViewHolder>{ private List<DataHolder> displayedList; public class MyViewHolder extends RecyclerView.ViewHolder{ public TextView english_d; public MyViewHolder(View view){ super(view); english_d = (TextView) view.findViewById(R.id.engword); } } public DisplayAdapter(List<DataHolder> displayedList){ this.displayedList = displayedList; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int position) { // create a layout View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { DataHolder content = displayedList.get(position); holder.english_d.setText(content.getEnglish()); } @Override public int getItemCount() { return displayedList.size(); } } 

DataHolder.java

 public class DataHolder { private String english; public DataHolder() { } public DataHolder(String english, String norse) { this.english = english; } public String getEnglish() { return english; } public void setEnglish(String english) { this.english = english; } } 

y aquí está el fragmento con el que estoy trabajando:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.activity_two_fragment, container, false); rv = (RecyclerView) view.findViewById(R.id.list_view_english); rv.setHasFixedSize(true); inputSearch = (EditText) view.findViewById(R.id.inputSearch); rv.addItemDecoration(new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL)); final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); rv.setLayoutManager(layoutManager); DisplayContent(); disp_adapter = new DisplayAdapter(displayedList); rv.setAdapter(disp_adapter); return view; } 

en su adaptador añadir nueva función para actualizar la lista

 public void updateList(List<DataHolder> list){ displayedList = list; notifyDataSetChanged(); } 

add textWatcher for search permite decir que está utilizando Edittext como campo de búsqueda

 searchField.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // filter your list from your input filter(s.toString()); //you can use runnable postDelayed like 500 ms to delay search text } }); void filter(String text){ List<DataHolder> temp = new ArrayList(); for(DataHolder d: displayedList){ //or use .equal(text) with you want equal match //use .toLowerCase() for better matches if(d.getEnglish().contains(text)){ temp.add(d); } } //update recyclerview disp_adapter.updateList(temp); } 

https://github.com/Wrdlbrnft/Searchable-RecyclerView-Demo . Refiérase a esto para la vista de Reciclador que se puede buscar y si desea un tutorial detallado refiérase a esto, https://www.studytutorial.in/android-search-to-recyclerview-tutorial

he hecho así

Archivo .XMl

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.design.widget.AppBarLayout android:id="@+id/appBar" android:layout_width="match_parent" android:layout_height="wrap_content" app:elevation="1dp" android:theme="@style/AppTheme.AppBarOverlay" android:layout_marginBottom="@dimen/bottom_margin"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/AppTheme.PopupOverlay"/> </android.support.design.widget.AppBarLayout> <EditText android:id="@+id/etSearch" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Search" android:imeOptions="actionDone" android:singleLine="true"/> <android.support.v7.widget.RecyclerView android:id="@+id/rvCategory" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView> </LinearLayout> 

Archivo de clase .JAVA

 package com.example.myapplication; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.CardView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.Filter; import android.widget.Filterable; import android.widget.ImageView; import android.widget.TextView; import org.json.JSONObject; import java.util.ArrayList; public class Home extends AppCompatActivity implements ResultCallBack{ SQLiteDatabase db; ArrayList<String> alCategorName=new ArrayList<>(); RecyclerView rvCategory; EditText etSearch; Category bookadapter; ArrayList<String> alBookInfo; String strURL="http://localhost:21246/api/TreasuryBooks?BookId=1"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitleTextColor(getResources().getColor(R.color.white)); setSupportActionBar(toolbar); // AsyncTask_WebAPI asyncTask=new AsyncTask_WebAPI(this,strURL,this); // asyncTask.execute(); etSearch=(EditText)findViewById(R.id.etSearch); etSearch.setText(""); DatabaseAccess da= DatabaseAccess.getInstance(this); db=da.open(); alBookInfo=new ArrayList<String>(); Cursor c = db.rawQuery("select BookName from Books", null); int rows = c.getCount(); c.moveToFirst(); for(int i=0;i<rows;i++) { String strBoookName=c.getString(c.getColumnIndex("BookName")); alBookInfo.add(strBoookName); c.moveToNext(); } c.close(); db.close(); rvCategory=(RecyclerView)findViewById(R.id.rvCategory); //Recycler view adapter bookadapter=new Category(this,alBookInfo); rvCategory.setLayoutManager(new LinearLayoutManager(this)); rvCategory.setAdapter(bookadapter); //text change listner etSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { bookadapter.getFilter().filter(s.toString()); } @Override public void afterTextChanged(Editable s) { } }); } @Override public void onBackPressed() { Home.this.finish(); } @Override protected void onRestart() { super.onRestart(); etSearch.setText(""); } @Override public void onResultListener(Object object) { JSONObject jsonObject=(JSONObject)object; try { String strId = jsonObject.getString("id"); String strBookId=jsonObject.getString("BookId"); String strBookName=jsonObject.getString("BookName"); db.rawQuery("insert into Books values('"+strId+"','"+strBookId+"','"+strBookName+"'",null); } catch (Exception e) { e.printStackTrace(); } } 

Adaptador Recyclerview

  //Recycler view adapter Class with filterable interface private class Category extends RecyclerView.Adapter<viewHolder> implements Filterable { ArrayList<String> alBooks=new ArrayList<String>(); Context context; viewHolder holder; public Category() {} public Category(Context context,ArrayList<String> albooks) { this.context=context; this.alBooks=albooks; } @Override public int getItemCount() { return alBooks.size(); } @Override public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.home_cardview,parent,false); holder=new viewHolder(v); return holder; } @Override public void onBindViewHolder(viewHolder holder, int position) { holder.tvBookName.setText(alBooks.get(position)); } private Filter fRecords; //return the filter class object @Override public Filter getFilter() { if(fRecords == null) { fRecords=new RecordFilter(); } return fRecords; } //filter class private class RecordFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); //Implement filter logic // if edittext is null return the actual list if (constraint == null || constraint.length() == 0) { //No need for filter results.values = alBookInfo; results.count = alBookInfo.size(); } else { //Need Filter // it matches the text entered in the edittext and set the data in adapter list ArrayList<String> fRecords = new ArrayList<String>(); for (String s : alBookInfo) { if (s.toUpperCase().trim().contains(constraint.toString().toUpperCase().trim())) { fRecords.add(s); } } results.values = fRecords; results.count = fRecords.size(); } return results; } @Override protected void publishResults(CharSequence constraint,FilterResults results) { //it set the data from filter to adapter list and refresh the recyclerview adapter alBooks = (ArrayList<String>) results.values; notifyDataSetChanged(); } } } private class viewHolder extends RecyclerView.ViewHolder { CardView cv; TextView tvBookName; viewHolder(final View itemview) { super(itemview); cv = (CardView) itemview.findViewById(R.id.cardview); tvBookName = (TextView) itemview.findViewById(R.id.categoryName); itemview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(Home.this,Act_Fragment_Container.class); intent.putExtra("BookName", tvBookName.getText()); startActivity(intent); } }); } } 

}

agregue el adaptador de la vista de reciclador en la misma clase para evitar confusiones ….

Esto podría ayudarle. Tiene los medios para crear un RecyclerView con un SearchView para filtrar los elementos del RecyclerView.

  • Recyclerview Adaptador y Glide - misma imagen cada 4-5 filas
  • Centro Horizontal última fila utilizando span Recycler GridLayoutManager
  • ANDROID: Múltiples vistas de tarjeta dentro de la vista de reciclador
  • Los elementos no tienen el mismo ancho cuando se utiliza RecyclerView GridLayoutManager para establecer el espaciado de columnas por ItemDecoration
  • RecyclerView vs. ListView
  • Cómo animar los elementos de RecyclerView cuando aparecen
  • La forma más sencilla de mostrar Cuerdas con iconos en un RecyclerView
  • NestedScrollView desplazamiento con recyclerview
  • Cómo hacer la primera imagen más grande en Gridlayout?
  • ¿La transición reversa reversa del elemento del androide sobre detrás después de cambio de la orientación?
  • La barra de herramientas no se contrae con RecyclerView anidado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.