Android:在用户输入查询时过滤列表的最快方法

时间:2016-01-19 18:00:09

标签: android sorting arraylist filtering comparator

美好的一天,我有一个对象列表(为简单起见,我们称之为ContactObject)。该对象包含2个字符串,名称和电子邮件。

此对象列表的大小约为2000。这里的目标是在用户键入字母时过滤该列表,并在屏幕上显示它(如果它们与Recyclerview中的IE)匹配。理想情况下,它会过滤具有非空名称的对象位于具有空名称的对象上方的位置。

截至目前,我正在采取的步骤是:

1)创建2个列表以启动并获取用户键入的字符串以与

进行比较
List<ContactObject> nameContactList = new ArrayList<>();
List<ContactObject> emailContactList = new ArrayList<>();
String compareTo; //Passed in as an argument

2)通过增强的for循环遍历ContactObjects的主列表

3)获取姓名并通过电子邮件发送电子邮件

   String name = contactObject.getName();
   String email = contactObject.getEmail();

4)如果名称匹配,请将其添加到列表中。如果名称不为null,则有意跳过此循环,并将其添加到列表中以防止加倍。

     if(name != null){
        if(name.toLowerCase().contains(compareTo)){
            nameContactList.add(contactObject);
            continue;
        }
    }
    if(email != null){
        if(email.toLowerCase().contains(compareTo)){
            emailContactList.add(contactObject);
        }
    }

5)现在,在for循环之外构建对象列表时,使用比较器对名称进行排序(我不关心用电子邮件对那些进行排序)< / p>

Collections.sort(nameContactList, new Comparator<ContactObject>() {
            public int compare(ContactObject v1, ContactObject v2) {
                String fName1, fName2;
                try {
                    fName1 = v1.getName();
                    fName2 = v2.getName();
                    return fName1.compareTo(fName2);
                } catch (Exception e) {
                    return -1;
                }
            }
        });

6)遍历构建的列表(一个已排序),然后将它们添加到主列表中,该列表将用于设置到recyclerview的适配器:

for(ContactObject contactObject: nameContactList){
    masterList.add(contactObject);
}
for(ContactObject contactObject: emailContactList){
    masterList.add(contactObject);
}

7)然后我们都完成了。

这就是问题所在,这段代码运行得很好,但速度很慢。当我通过2000的列表过滤时,每次用户键入一个字母时可能需要1-3秒。

我的目标是模拟允许您搜索手机联系人列表的应用程序,但似乎总是比我能够复制的更快。

有没有人对如何加速这一过程提出任何建议?

是否有一些隐藏的Android秘密,我不知道这只会让您更快地查询一小部分联系人?

0 个答案:

没有答案