1

I have an Activity with toolbar and I am calling fragment which consists of recyclerview and in toolbar there is search option, when I search with text the recyclerview should get filtered. Please help me out.

Here is my code In Activity i have toolbar -

public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        final MenuItem item = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) 
        MenuItemCompat.getActionView(item);
        searchView.setOnQueryTextListener(new 
        SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                System.out.println("Clicked...");
                search = newText;
                return false;
            }
      });
      System.out.println("Item : "+item);
      return true;
  }

In Fragment I have recyclerview where it is setting adapter

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
  mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new MyRecyclerViewAdapter(results);
}

In MyRecyclerViewAdapter -

    public class MyRecyclerViewAdapter extends RecyclerView
        .Adapter<MyRecyclerViewAdapter
        .DataObjectHolder> {
            private static String LOG_TAG = "MyRecyclerViewAdapter";
            public static ArrayList<DataObject> mDataset;
            public static ArrayList<DataObject> mFilteredList;
            private static MyClickListener myClickListener;
            View view;

            public class DataObjectHolder extends RecyclerView.ViewHolder
            implements View.OnClickListener, Filterable {
                 ImageView img;
                 TextView label;
                 ImageView img_navi;
                 TextView txt_add;
                 TextView txt_id;
                 TextView txt_desc;
                 ImageView img1;
                 TextView name;
                 TextView title_desc;
                 CircularImageView profile_img;

        public DataObjectHolder(View itemView) {
            super(itemView);
            img = (ImageView)itemView.findViewById(R.id.img);
            label = (TextView) itemView.findViewById(R.id.txt_issues);
            img_navi = (ImageView) itemView.findViewById(R.id.img_navi);
            txt_add = (TextView)itemView.findViewById(R.id.txt_add);
            txt_id = (TextView)itemView.findViewById(R.id.txt_id);
            txt_desc = (TextView)itemView.findViewById(R.id.txt_desc);
            img1 = (ImageView) itemView.findViewById(R.id.img1);
            name = (TextView)itemView.findViewById(R.id.txt_name);
            profile_img = (CircularImageView) 
            itemView.findViewById(R.id.img_pic);
            title_desc = (TextView)itemView.findViewById(R.id.title_desc);
            Log.i(LOG_TAG, "Adding Listener");
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
        }

        @Override
        public Filter getFilter() {

            return new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence
                charSequence) {

                    String charString = charSequence.toString();

                    if (charString.isEmpty()) {
                        mFilteredList = mDataset;
                    } else {
                        ArrayList<DataObject> filteredList = new ArrayList<>();
                        for (DataObject dataObject : mDataset) {
                            if (dataObject.getmText1().toLowerCase().contains(charString) || dataObject.getmText2().toLowerCase().contains(charString) || dataObject.getmText3().toLowerCase().contains(charString) || dataObject.getmText4().toLowerCase().contains(charString) || dataObject.getmText5().toLowerCase().contains(charString)|| dataObject.getmText6().toLowerCase().contains(charString)) {

                                filteredList.add(dataObject);
                            }
                        }

                        mFilteredList = filteredList;
                    }

                    FilterResults filterResults = new FilterResults();
                    filterResults.values = mFilteredList;
                    return filterResults;
                }

                @Override
                protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                    mFilteredList = (ArrayList<DataObject>) filterResults.values;
                    notifyDataSetChanged();
                }
            };
        }
    }

    public void setOnItemClickListener(MyClickListener myClickListener) {
        this.myClickListener = myClickListener;
    }

    public MyRecyclerViewAdapter(ArrayList<DataObject> myDataset) {
        mDataset = myDataset;
        mFilteredList = myDataset;
    }

    @Override
    public DataObjectHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
        if(MyComplaintsFragment.my_complaints == true){
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.card_view_row1, parent, false);
        }
        else {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.card_view_row, parent, false);
        }
        DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
        return dataObjectHolder;
    }

    @Override
    public void onBindViewHolder(DataObjectHolder holder, int position) {
        holder.img.setImageResource(R.drawable.play);
        holder.label.setText(mDataset.get(position).getmText6());
        holder.img_navi.setImageResource(R.drawable.navigation);
        holder.txt_add.setText(mDataset.get(position).getmText2());
        holder.txt_id.setText(mDataset.get(position).getmText3());
        holder.txt_desc.setText(mDataset.get(position).getmText4());
        holder.name.setText(mDataset.get(position).getmText5());
        holder.title_desc.setText(mDataset.get(position).getmText1());
        holder.img1.setImageResource(R.drawable.i1);
    }

    public void addItem(DataObject dataObj, int index) {
        mDataset.add(index, dataObj);
        notifyItemInserted(index);
    }

    public void deleteItem(int index) {
        mDataset.remove(index);
        notifyItemRemoved(index);
    }

    @Override
    public int getItemCount() {
        return mDataset.size();
    }

    public interface MyClickListener {
        public void onItemClick(int position, View v);
    }
}

How do I use getFilter from the adapter

Thank you

Shradha
  • 21
  • 3
  • take a look this link it may help you [Searching particular word in RecyclerView using adapter](https://stackoverflow.com/questions/45143563/autosearching-option-using-filter-method-in-recyclerview) ask me in case of any query – AskNilesh Aug 03 '17 at 07:52
  • @NileshRathod Thank you for the reply, but I have searchview in activity and recyclerview in fragment so I am not understanding how do I use text in fragment when the text is been edited – Shradha Aug 03 '17 at 08:05

1 Answers1

0

Your main concern is how to communicate search view with fargment?. It is possible to communicate searchView which is located in your activity toolbar to adapter that is related to your fragment.

  1. In your activity you have fragment instance of desired Fragment (That has adapter)
  2. Create a method in your fragment like addSearch(String text) and it will be public.
  3. Call method in your fragment in your onQueryTextChange like:

    if(fragmentInstance instanceOf YourFragment){ ((YourFragment)fragment).addSearch(queryText);}

now you can call your adapter from addSearch method

Tariqul Islam
  • 680
  • 6
  • 14