自定义有过滤功能的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中数据。