有时,我们需要对列表进行筛选,并且不希望通过一些页面跳转,复杂的逻辑处理来实现,这时我们就需要一个自定义的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;
}