前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android RecyclerView添加搜索过滤器

Android RecyclerView添加搜索过滤器

作者头像
code_horse
发布2018-07-02 14:48:53
1.1K0
发布2018-07-02 14:48:53
举报
文章被收录于专栏:Android NoteAndroid NoteAndroid Note

搜索过滤功能,相信大家都能用到,一般都是针对列表进行过滤的。下面给大家提供一种过滤列表的方法。

老规矩,先上图

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) {

            }
        });

好了,到这里就结束了?。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.01.16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档