代码之家  ›  专栏  ›  技术社区  ›  Andrii Afanasenko

仅显示一定数量的联系人

  •  2
  • Andrii Afanasenko  · 技术社区  · 6 年前

    我开发了一个程序,显示我电话簿中的联系人列表。 为此,我使用以下代码:

        ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null,
                ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'",
                null,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
        if (cursor != null && cursor.getCount() > 0) {
            while (cursor.moveToNext()) {
                String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
               Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(id)); 
                Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id,
                        null,
                        null);
                if (phones != null) {
                        while (phones.moveToNext()) {
                            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    
                            contactList.add(new Contact(name, phoneNumber, id));
                        }
    
                    phones.close();
                }
            }
            cursor.close();
        }
        adapter = new ContactAdapter(contactList, R.layout.contacts_list_item, getApplicationContext());
        recyclerView.setAdapter(adapter);
    

    一切正常,程序会显示我通讯录中的所有联系人,但是 我想显示一定数量的联系人 . 例如: 我打开程序,从通讯录中加载前50个联系人,滚动后,接下来的50个联系人被加载到列表的末尾。等等

    2 回复  |  直到 6 年前
        1
  •  1
  •   Abdul Waheed    6 年前

    使用以下具有限制原因的代码。将代码替换为以下内容

    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
                null,
                ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1' ",
                null,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE LOCALIZED ASC LIMIT 10");
    

    它将获得前10条记录。在pull-to-refresh实现中,获取更多关于pull-to-refresh回调事件的记录。希望这对你有帮助

        2
  •  -1
  •   marmor    6 年前

    我想你想要这个的原因是因为加载所有联系人非常慢。 速度非常慢的原因是,当前每个联系人有一个查询,因此如果用户有500个联系人,则需要运行500个查询。

    您可以将查询数量减少到一个,然后我假设您不需要限制。

    String[] projection = { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER };
    Cursor phones = getContentResolver().query(Phone.CONTENT_URI, projection, null, null, Phone.DISPLAY_NAME + " ASC");
    
    while (phones.moveToNext()) {
        String name = phones.getString(1);
        String phone = phones.getString(2);
        Long id = phones.getLong(0);
    
        contactList.add(new Contact(name, phone, id));
    }
    phones.close();
    

    如果您希望每个联系人(而不是每个手机)只显示一个项目,您可以更改 contactList 字段是一个 HashMap<Long, Contact> 而不是 List ,并将新找到的手机添加到现有 Contact 对象(如果它已存在于地图中)。

    类似于:

    Contact contact = allContacts.get(id);
    if (contact == null) {
        contact = new Contact(name, phone, id);
        allContacts.put(id, contact);
    } else {
        contact.addPhone(phone); // you'll need to implement this
    }