自定义有过滤功能的BaseAdapter

自定义有过滤功能的BaseAdapter

为实现类似拨号界面的动态查询功能搭建,借此记录。

总体来说是为了将addTextChangedListener()与ListView()组合起来。

1.准备数据集

List<ItemBean> itemBeanList;

如果需要将重复数据剔除可以使用Set集合再用List存储。

Set<ItemBean> itemSet = new HashSet<>();
/*向Set存放数据*/
itemBeanList = new ArrayList<>();
itemBeanList.addAll(itemSet);

自定义的实体类要实现HashSet的话需要完成equals()和hashCode()函数

@Override
public boolean equals(Object obj) {
    //先确定传入的数据是否为一类
    if (obj instanceof ItemBean) {
    //在判断相同
    return this.number.equals(((ItemBean) obj).getNumber());
    }
    return false;
}

@Override
public int hashCode() {
   //返回一个hash数
   return Objects.hash(number);
}

2.自定义Adapter

public class SearchAdapter extends BaseAdapter implements Filterable {
private final Context mcontext;
private final List<ItemBean> itemBeans;
private List<ItemBean> itemBeans_to;

public SearchAdapter(Context c, List<ItemBean> itemBeans) {
    this.mcontext = c;
    this.itemBeans = itemBeans;
    this.itemBeans_to = this.itemBeans;
}
  • 需要继承Filterable接口以实现getFilter()
  • 传入数据时需要准备好原始数据与当前数据。

构造视图方面跳过直接来到getFilter()部分。

@Override
public Filter getFilter() {
    return new android.widget.Filter() {

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            // TODO Auto-generated method stub
            //将当前数据替换成筛选完成的数据
            itemBeans_to = (ArrayList<ItemBean>) results.values;
            //ListView更新数据
            notifyDataSetChanged();
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            // TODO Auto-generated method stub
            //初始化过滤结果
            FilterResults Result = new FilterResults();
            //如果筛选字符为空,则返回原始数据
            if (constraint.length() == 0) {
                Result.values = itemBeans;
                Result.count = itemBeans.size();
                return Result;
            }
            //创建空数据集,负责收集筛选结果
            List<ItemBean> Filtered_Names = new ArrayList<>();
            //筛选数据统一化
            String filterString = constraint.toString().toLowerCase();
            ItemBean filterableString;
            //遍历整个原始数据数据
            for (int i = 0; i < itemBeans.size(); i++) {
                filterableString = itemBeans.get(i);
                //如果包含筛选数据就放进去
                if (filterableString.getNumber().toLowerCase().contains(filterString)) {
                    Filtered_Names.add(filterableString);
                }
            }
            Result.values = Filtered_Names;
            Result.count = Filtered_Names.size();
            //返回过滤结果
            return Result;
        }
    };
}
  • getFilter()需返回一个Filter并相对应完善Filter所需的两个函数,publishResults(),performFiltering()。
  • publishResults()负责公布筛选结果。
  • performFiltering()负责执行过滤。

3.实现

SearchAdapter searchAdapter;
ListView test;
test = (ListView) findViewById(R.id.test);
searchAdapter = new SearchAdapter(this, itemBeanList);
test.setAdapter(searchAdapter);
  • ListView配置适配器与数据。
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        //忽略
    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        //忽略
    }

    @Override
    public void afterTextChanged(Editable editable) {
        if (editable.length() == 0) {
            searchAdapter.getFilter().filter(" ");
        } else {
            searchAdapter.getFilter().filter(editable.toString());
        }
    }
});
  • 这里的关键词来自于用户的输入,通过addTextChangedListener获得输入的数据,再通过Filter更新ListView中数据。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值