在 android 中有条件地显示所有联系人的最快方法

Fastest way to display all contacts in android but conditionally

也许标题误导了我真正想要的。我有一个 Web 服务,它以 Json 格式给我一些 phone 号码。 像这样:

{
  "phone":123456989,
}

此 Web 服务可以 return 超过 500 个结果。解析没有问题,并显示在列表视图中。

我想在我的 phone 中显示所有联系人(带有 phone 号码),我也可以这样做。

假设我的联系人列表中有四个 phone 号码(实际上是 500)

123456989
123456945
123456912
123456923

我想显示所有联系人,比较我从网络服务获得的结果

像这样:

123456989 --- using_this_app
123456945
123456912
123456923

类似于 Viber 或 Whatsapp,它们会显示联系人正在使用此应用程序的标记。

如果我想将网络服务的每个结果与每个联系人进行比较,我可以完成我想要的,但问题是这会花费很多时间。我怎样才能做得更快?所以比较不会像viber或whatsapp那样花太长时间

一个简单的选择是:将两个 "data sets" 都放入 Set 对象中。然后你可以使用 retainAll 轻松缩小这两个列表的 intersection:

使用retainAll,您可以轻松获取两个列表中的所有条目:

Set<String> setA = ...
Set<String> setB = ...
setA.retainAll(setB); // setA now contains only elements in both sets

使用 removeAll,您可以轻松获取仅在两个列表之一中的所有条目(例如突出显示 phone 书中的那些数字没有使用你的应用程序)。

[ 免责声明:从 JSON 输入中提取这样一组的工作; phone 的联系人列表留给 reader 作为练习。对于一个期望他的应用有这么多用户的人;他的应用程序有机会通过联系人找到其他应用程序用户,剩下的工作应该只是 "peanuts"。 ]

另一种快速简单的方法是将所有服务器 phone 号码添加到字符串列表中。然后使用“.contains”检查所有移动 phone 号码,因为您总是在列表中显示所有移动 phone 号码,就像在显示移动 phone 号码的适配器中那样:

    List<String> serverPhoneNumbers = new ArrayList<String>;
    if(serverPhoneNumbers.contains(mobilePhoneNumber)){
        //matched on server...
    }else{
        //not matched on server...
    }

在你的情况下,我建议你做一些不同的事情,如果你在你的应用程序中添加了手机号码注册功能, 这意味着 you have already registered user list 在服务器端的数据库中使用 Number

现在,做与你正在做的完全相反的事情。

首先读取 device/Phone 的所有联系方式并 将所有号码发送到服务器并在其中放置仅 returns 注册号码列表作为响应的条件,也没有必要在应用程序端放置某种比较条件,因为它会花费太多时间。