java - 如何提高数组列表的获取速度?

标签 java android listview arraylist android-contacts

我正在使用 Arraylist 来获取应用程序中的所有可用联系人。这效率不高,因为 Arraylist 需要很长时间来获取和填充 Listview,因为几乎有 600 多个联系人

我正在寻找一种性能更好的替代方法。

虽然我搜索了其他相关问题,但找不到方便的问题。

这是我的java代码:

private List<String> getContactList() {
      List<String> stringList=new ArrayList<>();
      ContentResolver cr = context.getContentResolver();
      Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
        null, null, null, null);

      if ((cur != null ? cur.getCount() : 0) > 0) {
        while (cur != null && cur.moveToNext()) {
          String id = cur.getString(
            cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur.getString(cur.getColumnIndex(
            ContactsContract.Contacts.DISPLAY_NAME)
          );

          if (cur.getInt(cur.getColumnIndex(
            ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
              Cursor pCur = cr.query(                  
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                null,
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                  new String[]{id}, null
               );

               while (pCur.moveToNext()) {
                 String phoneNo = pCur.getString(pCur.getColumnIndex(
                 ContactsContract.CommonDataKinds.Phone.NUMBER));                  
                 Log.v("Data : ",""+id+" "+name+" "+phoneNo);
                 stringList.add(id);
                 stringList.add(name);
                 stringList.add(phoneNo);
               }
               pCur.close();
             }
            }
          }
          if(cur!=null){
            cur.close();
          }
          return stringList;
        }   

最佳答案

您的查询效率低下,您当前正在对每个联系人进行一次查询,这非常慢,您可以通过一个大查询来获取所有内容(速度相当快):

String[] projection = new String[] { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER };
Cursor c = cr.query(Phone.CONTENT_URI, projection, null, null, null);
while (c.moveToNext()) {
   long contactId = c.getLong(0);
   String name = c.getString(1);
   String phone = c.getString(2);
   Log.i("Phones", "got contact phone: " + contactId + " - " + name + " - " + phone);
}
c.close();

关于java - 如何提高数组列表的获取速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54663384/

相关文章:

java - ListView 中的多个复选框?

android - Python 与 Android 通信?

android - 调用 ListView 的 setEmpty 方法不起作用(列表为空时不显示任何内容)

java - 如何将已检查的异常从 CompletableFuture 传递到 ControllerAdvice

java - 根据 OIM 中的自定义属性值搜索用户

android - 循环播放音频文件

java - 根据 Android 中的微调器选择更新 ListView

android - 如何删除列表查看所有项目

java - 禁用网络连接

java - 如何从另一个类调用方法函数?