一个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

还有待完善,

一个java的FilterArrayList实现,布布扣,bubuko.com

时间: 2024-07-31 14:25:59

一个java的FilterArrayList实现的相关文章

第一个JAVA程序解析

上一篇博客中,我们编写了第一个JAVA程序并使用最原始的方式对其进行编译运行,很多文章或书籍中对该种编译运行方式不做介绍,但是我认为这有助于我们更好的了解.学习JAVA,是不可忽略的一部分,在我身边有很多人,学完一段时间JAVA后,只知道如何在IDE中进行开发,却不知脱离IDE后该如何运行,不得不说这也是一种悲哀. 言归正传,我们来看一下上一篇博客中的例子"Hello World",这也是几乎所有的编程语言都会编写的一个例子,非常的经典. 下面我们就来分析一下: /**  *  我的第

一个java高级工程师的进阶之路

宏观方面 一. JAVA.要想成为JAVA(高级)工程师肯定要学习JAVA.一般的程序员或许只需知道一些JAVA的语法结构就可以应付了.但要成为JAVA(高级) 工程师,您要对JAVA做比较深入的研究.您应该多研究一下JDBC.IO包.Util包.Text包.JMS.EJB.RMI.线程.如果可能,希望您 对JAVA的所有包都浏览一下,知道大概的API,这样您就发现其实您想实现的很多功能,通过JAVA的API都可以实现了,就不必自己费太多的脑经 了. 二. 设计模式.其实写代码是很容易的事情,我

当世界上只剩下一个Java程序员

公元2050年,世界上只剩下了一个Java程序员. 你可能要问了,别的人都去哪儿了?原因很简单, Java没落了. 大约在2030年左右,出现了一个叫做X的语言,它既能做系统级开发(操作系统.数据库.编译器),也能做服务器端的开发,手机端,Web端都不在话下. 更为重要的是,这个新的编程语言和人类的自然语言很接近,无论大人小孩,稍微一学,很快就可以来编程.于是排名前100的语言统统消失了, 程序员们都失业了. Java也不例外,这个昔日的霸主在留下了一堆庞大而复杂的系统以后就不见了. Java程

Java基础-接口中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产。请编写一个java应用程序描述上述的体制现象。 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,

36.中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产.请编写一个java应用程序描述上述的体制现象. 要求如下: (1)该应用程序中有一个“党中央”接口:CentralPartyCommittee,该接口中 有个“坚持党的领导”方法:void partyLeader() (2)该应用程序中有一个“国务院”抽象类:StateCouncil,该抽象类中有个“安 全生产”的抽象方法:abstract void safetyInProduction() (

java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E

21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public void speak() 方法,在speak方法中输出“咿咿呀呀......”的信息. (2)People类是Monkey类的子类,在People类中重写方法speak(),在speak方法 中输出“小样的,不错嘛!会说话了!”的信息. (3)在People类中新增方法void think(),在thi

自己写一个java.lang.reflect.Proxy代理的实现

前言 Java设计模式9:代理模式一文中,讲到了动态代理,动态代理里面用到了一个类就是java.lang.reflect.Proxy,这个类是根据代理内容为传入的接口生成代理用的.本文就自己写一个Proxy类出来,功能和java.lang.reflect.Proxy一样,传入接口.代理内容,生成代理. 抛砖引玉吧,个人觉得自己写一些JDK里面的那些类挺好的,写一遍和看一遍真的是两个不同的概念,写一遍既加深了对于这些类的理解.提升了自己的写代码水平,也可以在写完之后对比一下自己的实现有哪些写得不好

java基础:java环境,第一个Java程序,java的数组

java环境: 1. 什么是字节码和虚拟机? 2. 环境变量的设置 3.一些常用的java命令 4. 计算机如何运行java程序? 5. java的垃圾回收器 6. java的基本数据类型及转换 举例:第一个Java程序 Java的数组: 1. 一维数组 数组的声明 数组分配空间及初始化 数组的长度 两个数组之间的拷贝:System.arraycopy(array1,start,array2,start,length) 2. 二位数组 二维数组的声明及初始化

spring mvc返回json字符串数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable

1.spring mvc返回json数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable 2. @RequestMapping(value = { "/actor_details" }, method = { RequestMethod.POST }) @ResponseBody public ResultObject actorDetails(@RequestBody ActorDetailsRequest req)

一个java高级工程师的进阶之路【转】

宏观方面 一. JAVA.要想成为JAVA(高级)工程师肯定要学习JAVA.一般的程序员或许只需知道一些JAVA的语法结构就可以应付了.但要成为JAVA(高级) 工程师,您要对JAVA做比较深入的研究.您应该多研究一下JDBC.IO包.Util包.Text包.JMS.EJB.RMI.线程.如果可能,希望您 对JAVA的所有包都浏览一下,知道大概的API,这样您就发现其实您想实现的很多功能,通过JAVA的API都可以实现了,就不必自己费太多的脑经 了. 二. 设计模式.其实写代码是很容易的事情,我