(转)Android RecyclerView添加搜索过滤器

转载自:https://www.jianshu.com/p/04a2e42a732e

 
 

RecycleView搜索过滤器-getFilter()

Android 提供了Fileterable类,可以通过过滤器(条件)来过滤数据。通常,getFilter()方法必须在提供过滤条件的适配器类中被重写,以通过列表进行搜索。下面是通过getFilter(),来过滤数据。

        @Override
        public Filter getFilter() {
            return new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence charSequence) {
                    String charString = charSequence.toString();
                    if (charString.isEmpty()) {
                        mFilterList = mSourceList;
                    } else {
                        List<String> filteredList = new ArrayList<>();
                        for (String str : mSourceList) {
                            //这里根据需求,添加匹配规则
                            if (str.contains(charString)) {
                                filteredList.add(str);
                            }
                        }

                        mFilterList = filteredList;
                    }

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

                @Override
                protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                    mFilterList = (ArrayList<String>) filterResults.values;
                    //刷新数据
                    notifyDataSetChanged();
                }
            };
        }

完整Adapter代码:

//这里实现Filterable接口
class TitleAdapter extends RecyclerView.Adapter<TitleAdapter.TitleHolder> implements Filterable {

        private List<String> mSourceList = new ArrayList<>();
        private List<String> mFilterList = new ArrayList<>();

        private void appendList(List<String> list) {
            mSourceList = list;
            //这里需要初始化filterList
            mFilterList = list;
        }

        @Override
        public TitleHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new TitleHolder(LayoutInflater.from(FastScrollRecyclerActivity.this).inflate(R.layout.item_textview_view, parent, false));
        }

        @Override
        public void onBindViewHolder(TitleHolder holder, int position) {
           //这里也是过滤后的list
           holder.tv.setText(mFilterList.get(position));
        }

        @Override
        public int getItemCount() {
            //注意这里需要是过滤后的list
            return mFilterList.size();
        }
        //重写getFilter()方法
        @Override
        public Filter getFilter() {
            return new Filter() {
                //执行过滤操作
                @Override
                protected FilterResults performFiltering(CharSequence charSequence) {
                    String charString = charSequence.toString();
                    if (charString.isEmpty()) {
                        //没有过滤的内容,则使用源数据
                        mFilterList = mSourceList;
                    } else {
                        List<String> filteredList = new ArrayList<>();
                        for (String str : mSourceList) {
                            //这里根据需求,添加匹配规则
                            if (str.contains(charString)) {
                                filteredList.add(str);
                            }
                        }

                        mFilterList = filteredList;
                    }

                    FilterResults filterResults = new FilterResults();
                    filterResults.values = mFilterList;
                    return filterResults;
                }
                //把过滤后的值返回出来
                @Override
                protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                    mFilterList = (ArrayList<String>) filterResults.values;
                    notifyDataSetChanged();
                }
            };
        }

        class TitleHolder extends RecyclerView.ViewHolder {
            TextView tv;

            public TitleHolder(View itemView) {
                super(itemView);
                tv = (TextView) itemView.findViewById(R.id.id_tv_test);
            }
        }
    }

数据初始化部分

private String[] str = new String[]{
            "apple", "apple juice", "apple pie", "abalone", "bread", "brandy", "Blueberry", "Banana", "chocolate", "cake", "chicken", "cheese", "Durian",
            "Dim Sam", "Dumpling", "duck", "egg", "English muffin", "eggplant", "French toast", "fish", "fig", "fruit"
    };
private List<String> mList = new ArrayList<>();
private void initList() {
        for (int i = 0; i < str.length; i++) {
            mList.add(str[i]);
        }
    }

设置RecycleView和EditText监听

        RecyclerView rv = (RecyclerView) findViewById(R.id.id_rv);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        rv.setLayoutManager(manager);
        final TitleAdapter adapter = new TitleAdapter();
        adapter.appendList(mList);
        rv.setAdapter(adapter);

        EditText et = findViewById(R.id.id_et);
        et.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence sequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence sequence, int i, int i1, int i2) {
                adapter.getFilter().filter(sequence.toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值