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 条评论
登录 后参与评论

相关文章

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

Recyclerview中使用databinding完成多布局

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

3802
来自专栏KK的小酒馆

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

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

1012
来自专栏上善若水

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

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

1283
来自专栏分享达人秀

自定义ArrayAdapter

ListView用起来还是比较简单的,也是Android应用程序中最重要的一个组件,但其他ListView可以随你所愿,能够完成很多想要的精美列表,而这...

2219
来自专栏向治洪

android FragmentpagerAdapter和FragmentStatePagerAdapter的区别

1.FragmentPagerAdapter FragmentPagerAdapter 继承自 PagerAdapter。相比通用的 PagerAdapter...

2109
来自专栏10km的专栏

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

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

21410
来自专栏Android开发指南

2.抽取代码(BaseActivity)

3588
来自专栏androidBlog

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

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

1791
来自专栏水击三千

Android学习之简单的数据存储

在Android中,数据存储是开发人员不可以避免的。Android为开发者提供了很多的存储方法,在前面的博客中,已经讲述了sqlite存储数据。今天将介绍用Sh...

2909
来自专栏懒人开发

Eventbus3代码分析(三):注解简单使用

自己每次在onCreate中写setContentView(R.layout.xxx) 感觉比较麻烦 自己想把注解写到类的前面,这样比较好修改

1284

扫码关注云+社区

领取腾讯云代金券