EditText配合listview实现过滤

本文详细介绍了如何使用EditText和ListView结合实现过滤功能,包括创建Adapter、实现Filterable接口、监听文本变化及退格键,以及更新ListView列表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天记个笔记 使用edittext和listview来实现过滤效果

主要涉及知识

1.普通listview+adapter 的使用方法

2.adapter实现filterable接口,adapter同时包含一继承自filter的内部类用于实现过滤规则的定义

3.edittext的监听,包括文本变化和退格键的监听

第一步:创建一个adapter,继承BaseAdapter实现Filterable接口,主要是实现里面 getFilter()方法;

第二步:准备一些数据,自己定义一个实体类,实现这个listview的列表;

第三部:在adapter中创建一个继承自filter的内部类,主要里面有两个方法FilterResults performFiltering(CharSequence prefix),和 publishResults(CharSequence constraint,FilterResults results)。具体实现如下:

protected FilterResults performFiltering(CharSequence prefix){
FilterResults results = new FilterResults();


if(alllistdata==null) {
synchronized(mLock) {
alllistdata = new ArrayList<Bean>(beanList);//
}
}


if(prefix==null||prefix.length()==0) {
synchronized(mLock) {
// ArrayList<T> list = new ArrayList<T>();//无
ArrayList<Bean> list = new ArrayList<Bean>(
alllistdata);// List<T>
results.values = list;
results.count = list.size();
}
} else {
String prefixString = prefix.toString().toLowerCase();

final ArrayList<Bean> hanzi = alllistdata;// 汉字String
final int count = hanzi.size();

final Set<Bean> newValues = new HashSet<Bean>(count);// 支持多音字,不重复


for(int i = 0;i<count;i++) {
final String value = hanzi.get(i).getName();// 汉字String
final String pinyin = hanzi.get(i).getNamePY().toLowerCase();
if(pinyin.contains(prefixString.toLowerCase())||pinyin.indexOf(prefixString.toLowerCase())!=-1||pinyin.equals(prefixString.toLowerCase())) {// 任意匹配
newValues.add(hanzi.get(i));
} else
if(value.indexOf(prefixString)!=-1) {
newValues.add(hanzi.get(i));
}
if(maxMatch>0) {// 有数量限制
if(newValues.size()>maxMatch-1) {// 不要太多
break;
}
}
}
List<Bean> list = Set2List(newValues);// 转成List
results.values = list;
results.count = list.size();
}
return results;

beanList = (List<Bean>)results.values;
if(results.count>0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}

第四步:实现监听

使用addTextChangedListener(),

public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
System.out.println(arg1 + "-----" + arg2 + "------" + arg3);
search=arg0.toString();
adapter.getFilter().filter(search);
adapter.notifyDataSetChanged();
}

在setOnKeyListener()实现退格监听

public boolean onKey(View arg0, int arg1, KeyEvent arg2) {
// TODO Auto-generated method stub
if (arg1 == KeyEvent.KEYCODE_DEL) {
System.out.println("onDelete");
adapter.updateList(list);
adapter.getFilter().filter(search);
}
return false;

updateList(list)主要作用是更新list

public void updateList(List<Bean> list){
this.beanList=list;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值