Android Filter趣事


有时,我们需要对列表进行筛选,并且不希望通过一些页面跳转,复杂的逻辑处理来实现,这时我们就需要一个自定义的Filter类来帮助我们快速处理筛选,并进行列表更新。 首先让我们的页面继承Filterable类
implements Filterable
这样我们就多出了1个方法 getFilter() 这个是调用筛选的入口
//我们需要定义一个过滤器的类来定义过滤规则
    public class MyFilter extends Filter {
        //我们在performFiltering(CharSequence charSequence)这个方法中定义过滤规则
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            FilterResults result = new FilterResults();
            List<Map<String, Object>> list;
            if (TextUtils.isEmpty(charSequence)) {//当过滤的关键字为空的时候,我们则显示所有的数据
                list = getData();
            } else {//否则把符合条件的数据对象添加到集合中
                list = new ArrayList<Map<String, Object>>();
//此处加入过滤逻辑 getData就是获取我们原本list的方法 通过对比原list中某些参数,过滤出我们需要的item并加入新的list中
 for (Map<String, Object> items : getData()) {
if (items.get("title").toString().contains(charSequence) || items.get("info").toString().contains(charSequence)) {
                        list.add(items);
                    }
                }
            }
            result.values = list; //将得到的集合保存到FilterResults的value变量中
            result.count = list.size();//将集合的大小保存到FilterResults的count变量中
            return result;
        }

        //在publishResults方法中告诉适配器更新界面
        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
//接收到参数后我们更新界面,此处可以加入是否为空判断
            mListBack = (List<Map<String, Object>>) filterResults.values;
            mList.clear();
            mList.addAll(mListBack);
            adapter.notifyDataSetChanged();//通知数据发生了改变
        }
    }
然后我们只要通过入口来调用即可
getFilter().filter(s);  //s即我们输入的要对比筛选的字符串


@Override
    public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new MyFilter();
        }
        return mFilter;
    }