首页 > 代码库 > 一个java的FilterArrayList实现
一个java的FilterArrayList实现
?
|
Android项目需求,要对一个ListView进行多字段模糊过滤, 系统自带的ArrayAdapter是有过滤功能,但是项目使用的是BaseAdapter适配器, List<Object>做数据源, 如果要实现过滤的话,就要遍历原始的List后重新生成新的List,至少需要两个List, 所以就想在不重新生成List的情况下,实现过滤功能.
首先声明一个过滤器接口 IObjectFilter
?
public interface IObjectFilter {<br> //如果对象匹配成功,则返回true boolean filter(Object object); } |
再继承ArrayList 实现 FilterArrayList :
?
public class FilterArrayList<T> extends ArrayList<T> { /** * */ private static final long serialVersionUID = 1975316155027160540L; private IObjectFilter mFilter; private Integer[] mFilteredIndices; //过滤后的index, public FilterArrayList(List<T> list) { super (list); } public FilterArrayList() { super (); } public boolean add(T object) {<br> //如果当前list处于过滤状态,则不允许添加新的对象 if (mFilter != null ) { return false ; } return super .add(object); } /*<br> * 在过滤状态下,要处理一系列插入删除动作, 有待完善<br> */ @Override public int size() { if (mFilteredIndices != null ) { <br> //此时,过滤后的index集合的大小就是整个List的大小 return mFilteredIndices.length; } else { return super .size(); } } public T get( int index) { if (mFilteredIndices != null ) {<br> //过滤状态下,转换过滤后对应的index index = getFilteredIndex(index); } return super .get(index); } public void setFilter(IObjectFilter filter) { if (filter == null ) { removeFilter(); } else { mFilter = filter; applyFilter(); } } private void applyFilter() { mFilteredIndices = null ; int size = super .size(); List<Integer> indices = new ArrayList<Integer>(); for ( int i= 0 ;i<size;i++) {<br> //调用过滤接口 if (mFilter.filter( super .get(i))) {<br> //如果返回true则保存此index indices.add(i); } } mFilteredIndices = new Integer[indices.size()]; indices.toArray(mFilteredIndices); } public void removeFilter() { mFilter = null ; mFilteredIndices = null ; } private int getFilteredIndex( int index) { return mFilteredIndices[index]; } } |
使用方法:
//实体类
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | //实体类 class Employee { String empNo; String briefCode; String name; ... }; List<Employee> employees = new List<Employee>(); employees.add(...); employees.add(...); employees.add(...); ..... //下面是演示怎么使用过滤 String filterString; //获取界面上模糊匹配的字符串 //实例化过滤器 IObjectFilter filter = new IObjectFilter() { public boolean filter(Object object) { Employee emp = (Employee)object; return (emp.empNo.indexOf(filterString) > - 1 || emp.name.indexOf(filterString) > - 1 || emp.briefCode.indexOf(filterString) > - 1 ) } }; //对List设置过滤器 employees.setFilter(filter); //OK, 现在List中就是我们需要过滤出来的对象了.<br><br>//取消过滤<br>employees.removeFilter();<br>或者<br>employees.setFilter(null); |
这个方法其实没有改变原始数组的数据, 只是交换了一下index的位置, 避免了反复的重新生成List
还有待完善,
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。