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干货

Java数据解析---JSON

3747
来自专栏IT可乐

mybatis源码解读(五)——sql语句的执行流程

873
来自专栏非著名程序员

Android内存泄漏终极解决篇(下)

一、概述 在 Android内存泄漏终极解决篇(上)中我们介绍了如何检查一个App是否存在内存泄漏的问题,本篇将总结典型的内存泄漏的代码,并给出对应的解决方案。...

1807
来自专栏菩提树下的杨过

几种常见复合sql查询语句的linq写法[继续补充中]

1.IN 语句 尝试了很多次,好象linq死活不生成in语句,无奈只能做了下变换 例,要找出"手机大类"以及"手机下属所有子类"的产品 (手机大类的ID为D0...

2066
来自专栏何俊林

超级实用的内存泄漏归纳分析心得

724
来自专栏于晓飞的专栏

Android开发从GC root分析内存泄漏

我们常说的垃圾回收机制中会提到GC Roots这个词,也就是Java虚拟机中所有引用的根对象。我们都知道,垃圾回收器不会回收GC Roots以及那些被它们间接引...

892
来自专栏技术小黑屋

Android性能调优利器StrictMode

作为Android开发,日常的开发工作中或多或少要接触到性能问题,比如我的Android程序运行缓慢卡顿,并且常常出现ANR对话框等等问题。既然有性能问题,就需...

1022
来自专栏知识分享

3-MSP430引脚中断

为了写一篇文章做铺垫--提醒着自己,,,,,, 这两天一直在寻找 #pragma vector = PORT1_VECTOR __interrupt void ...

2767
来自专栏吴小龙同學

Lambda for Android

Lambda,是我去年学习RxJava时知道的,它让代码看起来更加简洁,但个人认为代码的可读性差了很多,因此一直没有去深入学习。 什么是lambda la...

2799
来自专栏后端沉思录

mybatis拦截器分表

mybatis提供了拦截器插件用来处理被拦截的方法的某些逻辑.下面会通过创建8张表,当用户注册时,根据对手机号取余入不同的表.

1032

扫码关注云+社区