Android:用户键入查询时筛选列表的最快方法

Android:用户键入查询时筛选列表的最快方法,android,sorting,arraylist,filtering,comparator,Android,Sorting,Arraylist,Filtering,Comparator,大家好,我有一个对象列表(为了简单起见,我们称它们为ContactObject)。此对象包含两个字符串:名称和电子邮件 这个对象列表的大小大约在2000个左右。这里的目标是在用户键入字母时过滤该列表,并在屏幕上(即在回收视图中)显示匹配的字母。理想情况下,它将过滤具有非空名称的对象位于具有空名称的对象之上的位置 到目前为止,我正在采取的步骤是: 1)创建两个列表以开始并获取用户键入的字符串以进行比较 List<ContactObject> nameContactList = new

大家好,我有一个对象列表(为了简单起见,我们称它们为ContactObject)。此对象包含两个字符串:名称和电子邮件

这个对象列表的大小大约在2000个左右。这里的目标是在用户键入字母时过滤该列表,并在屏幕上(即在回收视图中)显示匹配的字母。理想情况下,它将过滤具有非空名称的对象位于具有空名称的对象之上的位置

到目前为止,我正在采取的步骤是:

1)创建两个列表以开始并获取用户键入的字符串以进行比较

List<ContactObject> nameContactList = new ArrayList<>();
List<ContactObject> emailContactList = new ArrayList<>();
String compareTo; //Passed in as an argument
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循环之外现在构建对象列表时,使用比较器对有名称的对象进行排序(我现在不关心对有电子邮件的对象进行排序)

7)然后我们都完成了

问题就在这里,这段代码工作得很好,但速度相当慢。当我筛选2000个大小的列表时,每次用户键入一封信可能需要1-3秒

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

有人对我如何加快这一进程有什么建议吗


是否有一些我不知道的隐藏的安卓秘密,只允许你快速连续地查询一小部分联系人

如果您了解(或对)RxJava有兴趣,可以使用filter()方法。我知道,如果你对此一无所知,但只是给你指出一个可能和有趣的方向,可能会有点困难。@DanielOcampo谢谢你的提示!我会马上调查的。
     if(name != null){
        if(name.toLowerCase().contains(compareTo)){
            nameContactList.add(contactObject);
            continue;
        }
    }
    if(email != null){
        if(email.toLowerCase().contains(compareTo)){
            emailContactList.add(contactObject);
        }
    }
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;
                }
            }
        });
for(ContactObject contactObject: nameContactList){
    masterList.add(contactObject);
}
for(ContactObject contactObject: emailContactList){
    masterList.add(contactObject);
}