Android RecyclerView添加搜索过滤器

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

老规矩,先上图

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

            }
        });

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android知识点总结

O3-开源框架使用之Butterknife 8.8.1及源码浅析

cast()方法是Clazz的一个公共方法:由下可见它反会一个由传入值强转成的T类型对象

1243
来自专栏10km的专栏

jface databinding:label provider 实现多列表格(Table)数据绑定的两个途径

显示需求 如下图,希望将一组拥有两个字段的表与两列的table绑定在一起,实现自动显示。 ? 在jface viewer中label provide...

19610
来自专栏androidBlog

Android 自定义 MarqueeView 实现跑马灯 —— 原理篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1221
来自专栏开发之途

RxJava2 入门详细笔记(2)

通过一定逻辑来过滤被观察者发送的事件,如果返回 true 则会发送事件,否则不会发送

621
来自专栏KK的小酒馆

Adapter与ListView的简单应用(下)Android应用界面开发

1.继续分析Adapter的常用类 上一篇文章使用了ArrayAdapte制作了一个只由简单的文字组成的ListView,那ArrayAdapter是不是只有...

812
来自专栏Android开发指南

2.抽取代码(BaseActivity)

3548
来自专栏Android干货

Android项目实战(三十七):Activity管理及BaseActivity的实现

4976
来自专栏一直在跳坑然后爬坑

Recyclerview中使用databinding完成多布局

其实目前使用Recyclerview的关键部分在于adapter如何去编写,网上也有很多大神封装了各种万能adapter来供大家使用,但是对于我们这些新手,如果...

2412
来自专栏Android先生

VLayout适配器的万能封装

传统的RecyclerView高级应用,还是挺麻烦的,阿里开源了Vlayout,采用代理模式独立承担各式各样的布局,大大的减少了程序媛的工作量,...

1474
来自专栏上善若水

002android初级篇之ViewPager及PagerSlidingTabStrip listview的使用

listView是一个可以用来显示视图列表的控件。 它使用适配器来为之提供数据和资源。

1183

扫码关注云+社区