【问题标题】:Searching particular word in RecyclerView using adapter使用适配器在 RecyclerView 中搜索特定单词
【发布时间】:2018-01-10 16:40:32
【问题描述】:

我有一个带有工具栏的活动,我正在调用由 recyclerview 组成的片段,并且在工具栏中有搜索选项,当我使用文本搜索时,recyclerview 应该被过滤。请帮帮我。

这是我的代码 在活动中我有工具栏 -

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

谢谢

【问题讨论】:

  • 看看这个链接它可能对你有帮助Searching particular word in RecyclerView using adapter有任何疑问可以问我
  • @NileshRathod 感谢您的回复,但我在活动中有 searchview,在片段中有 recyclerview,所以我不明白如何在编辑文本时使用片段中的文本

标签: android search filter android-recyclerview


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2015-05-22
    • 2016-05-20
    • 2015-09-15
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2017-08-28
    • 2019-12-29
    相关资源
    最近更新 更多