列表、网格等多条目数据控件在内存中实现过滤(筛选)

本文介绍了一种在Android Adapter中实现Filterable接口的方法,通过自定义过滤器WaybillFilter来实现列表项的异步过滤功能。具体步骤包括在Adapter中实现Filterable接口,创建自定义过滤器类,监听EditText的输入变化并触发过滤操作,在过滤完成后更新UI显示。

第一步:Adapter中实现Filterable接口(该接口通常是在Adapter中使用)

public class ExceptionWaybillAdapter extends BaseAdapter<ExceptionWaybill> implements Filterable {

    private WaybillFilter filter;
    private OnFilterListener onFilterListener;

    @Override
    public Filter getFilter() {
        if (filter == null) {
            filter = new WaybillFilter(mDatas);
        }
        return filter;
    }

    /**
     * 异步过滤器
     */
    private class WaybillFilter extends Filter {

        private List<ExceptionWaybill> originList;

        public WaybillFilter(List<ExceptionWaybill> originList) {
            this.originList = new ArrayList<>();
            this.originList.addAll(originList);
        }

        //子线程中调用
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            if (StringUtils.isEmpty(constraint)) {
                List<ExceptionWaybill> list = new ArrayList<>(originList);
                results.values = list;
                results.count = list.size();
            } else {
                List<ExceptionWaybill> list = new ArrayList<>();
                for (ExceptionWaybill waybill : originList) {
                    if (waybill.getWaybill().startsWith(constraint.toString())) {
                        list.add(waybill);
                    }
                }
                results.values = list;
                results.count = list.size();
            }
            return results;
        }

        //UI线程中调用
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            List<ExceptionWaybill> newList = (List<ExceptionWaybill>) results.values;
            //匹配到数据
            if (results.count > 0 && onFilterListener != null) {
                onFilterListener.onFilterSuccess(newList);
            }
            //没有匹配到数据
            if (constraint.length() > 0 && results.count == 0 && onFilterListener != null) {
                onFilterListener.onFilterNoData();
            }
        }
    }

    public void setOnFilterListener(OnFilterListener onFilterListener) {
        this.onFilterListener = onFilterListener;
    }

    public interface OnFilterListener {
        void onFilterSuccess(List<ExceptionWaybill> newList);
        void onFilterNoData();
    }
}

第二步 自定义过滤器(见上面代码WaybillFilter)

第三步 调用

//EditText中监听的事件TextWatcher
 @Override
    public void afterTextChanged(Editable s) {
        String waybill = s.toString().trim();
        adapter.getFilter().filter(waybill);
    }

第四步 在回调中处理结果

@Override
    public void onFilterSuccess(List<ExceptionWaybill> newList) {
        rvExceptionWaybill.setVisibility(View.VISIBLE);
        tvSearchTips.setVisibility(View.GONE);
        adapter.setmDatas(newList);
    }

    @Override
    public void onFilterNoData() {
        rvExceptionWaybill.setVisibility(View.GONE);
        tvSearchTips.setVisibility(View.VISIBLE);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值