Filterable的使用

过滤器接口

使用

在列表中使用

通过添加过滤条件,刷新符合条件的数据并显示。在列表中,通常都是在适配器实现Filterable接口,并重写getFilter方法。如下是getFilter方法的一个案例

@Override
public Filter getFilter() {
    return new Filter() {
        //执行过滤,在这里指明过滤条件
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String filterStr = constraint.toString();
            if (filterStr.isEmpty()) {
                mFilterBeans = mBeanList;
            } else {
                mFilterBeans.clear();
                for (FilterBean bean : mBeanList) {
                    //如果字符串是否以指定的前缀开始,那么就是想要的结果
                    if (bean.getFood().startsWith(filterStr)) {
                        mFilterBeans.add(bean);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = mFilterBeans;
            return results;
        }

        //发布过滤后的结果
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mFilterBeans = (ArrayList<FilterBean>) results.values;
            notifyDataSetChanged();
        }
    };
}

在其适配器构造器中,有如下实现:

public FilterAdapter(Context context, List<FilterBean> beanList) {
    mContext = context;
    mBeanList = beanList;//原始数据
    mFilterBeans = new ArrayList<>(beanList);//过滤源
}

整个过程要注意数据源和过滤后的源,他们最好不能是同一个,或者是同一个引用。在筛选过程中,都是通过筛选数据源里的数据,并一一添加进过滤数据源,保存最初的数据“范本”,才能在多次筛选中得到正确的没有遗漏的数据。当然,在适配器中,在这里展现的是过滤源的数据,所以在onBindViewHoldergetItemCount都是使用过滤源

@Override
public int getItemCount() {
    return mFilterBeans != null ? mFilterBeans.size() : 0;
}

知时节
1 声望0 粉丝