使用适配器在RecyclerView中搜索特定单词

时间:2017-08-03 07:50:37

标签: android search filter android-recyclerview

我有一个带有工具栏的活动,我正在调用包含recyclerview的片段,在工具栏中有搜索选项,当我用文本搜索时,应该过滤recyclelerview。请帮帮我。

这是我的代码 在Activity我有工具栏 -

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;
  }

在Fragment中我有recyclerview,它设置了适配器

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);
}

在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);
    }
}

如何使用适配器中的getFilter

谢谢

1 个答案:

答案 0 :(得分:0)

您主要关心的是如何与search view交流fargment?可以将活动searchView中的toolbar与与您的adapter相关的fragment进行通信。

  1. 在您的活动中,您有fragment个所需片段的实例(有适配器)
  2. 在您的fragment中创建一个方法,例如addSearch(String text),它将是公开的。
  3. 您的onQueryTextChange中的片段中的调用方法,例如:

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

现在您可以通过addSearch方法调用适配器了