美好的一天,我有一个对象列表(为简单起见,我们称之为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秘密,我不知道这只会让您更快地查询一小部分联系人?