EditText配合listview实现过滤
2015-12-14 20:44
274 查看
今天记个笔记 使用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.普通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;
}
相关文章推荐
- MFC+EXCEL
- ECMAScript 一元运算符
- 网站收到的url请求链接,字母全部变为小写
- android手机命令行下不能使用sqlite3命令查看*.db数据库文件解决办法
- split、rar拆分大文件
- init.rc语法详解
- 单例模式详解
- Android:怎么样通过资源的名字获取资源的id?
- android中invalidate()的自动清屏含义以及屏幕刷新
- 23种设计模式
- Chrome以https访问gitlab的问题:Your connection is not private
- 文件服务器之一:NFS服务器
- 【openjudge】小游戏(求助)
- 2015年12月7日实习日志
- Java我的高效编程之环境搭建
- sublime text 删除正行快捷键
- Java我的高效编程之环境搭建
- Java垃圾回收(GC)初识
- WindowManager.LayoutParams.type属性
- [HNOI2008]越狱 (快速幂模)