Search code examples
androidsearchviewandroid-recyclerview

Search through RecyclerView using Searchview


I want to search through RecyclerView, I have List<BaseOfCards> (BaseOfCards is my getter&setter class) My RecyclerViewAdapter :

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {


private LayoutInflater inflater;
private List<BaseOfCards> items;

//private int itemLayout;
//String cardvalue;
private Activity mActivity;

public RecyclerViewAdapter(Activity mActivity, Context context, List<BaseOfCards> items) {
    this.mActivity = mActivity;
    inflater = LayoutInflater.from(context);
    this.items = items;
    //this.itemLayout = itemLayout;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = inflater.inflate(R.layout.custom_row, parent, false);
    MyViewHolder holder = new MyViewHolder(view, mActivity);
    return holder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {

    BaseOfCards item = items.get(position);
    holder.title.setTag(item);
    holder.title.setText(item.getCardName());
}

@Override
public int getItemCount() {

    return items.size();
}

public static class MyViewHolder extends RecyclerView.ViewHolder {
    private Activity mActivity;
    TextView title;
    ImageView titileImageView;

    public MyViewHolder(View itemView, Activity mActivity) {

        super(itemView);

        titileImageView = (ImageView) itemView.findViewById(R.id.image_country);


        title = (TextView) itemView.findViewById(R.id.listText);
        this.mActivity = mActivity;

    }
}

}

I add SearchView to my menu and initialize it in MainActivity:

 MenuItem menuItem = menu.findItem(R.id.action_search1);
    searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
    SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView.setIconifiedByDefault(true);

What do I need to do next? Make my RecyclerViewAdapter implement Filterable or what? Or just make class filter in *RecyclerViewAdapter** and just call it from my MainActivity ?


Solution

  • I solved my problem

    1. Make my class RecyclerViewAdapter implements Filterable

    2. Add line private List<BaseOfCards> orig;

    3. Add method getFilter in RecyclerViewAdapter

      public Filter getFilter() {
      return new Filter() {
          @Override
          protected FilterResults performFiltering(CharSequence constraint) {
              final FilterResults oReturn = new FilterResults();
              final List<BaseOfCards> results = new ArrayList<BaseOfCards>();
              if (orig == null)
                  orig  = items;
                  if (constraint != null){
                      if(orig !=null & orig.size()>0 ){
                          for ( final BaseOfCards g :orig) {
                              if (g.getCardName().toLowerCase().contains(constraint.toString()))results.add(g);
                          }
                      }
                      oReturn.values = results;
                  }
                  return oReturn;
              }
      
      @Override
          protected void publishResults(CharSequence constraint, FilterResults results) {
              items = (ArrayList<BaseOfCards>)results.values;
              notifyDataSetChanged();
      
          }
      }; 
      
    4. Make MainActivity implements SearchView.OnQueryTextListener and change method onQueryTextChange :

      @Override
      public boolean onQueryTextChange(String newText) {
          if ( TextUtils.isEmpty ( newText ) ) {
              adapter.getFilter().filter("");
          } else {
              adapter.getFilter().filter(newText.toString());
          }
          return true;
      }