今天记个笔记 使用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;
}