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