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

465

被折叠的 条评论
为什么被折叠?



