仅显示一定数量的联系人

Show only a certain number of contacts

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

    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);

一切正常,程序显示了我 phone 书中的所有联系人,但是 我希望显示一定数量的联系人例如: 我打开程序并加载 phone 书中的前 50 个联系人,滚动后,接下来的 50 个联系人被加载到列表的末尾。等等

我假设您想要这个的原因是因为加载所有联系人的速度非常慢。 它非常慢的原因是因为您目前每个联系人有 1 个查询,所以如果一个用户有 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();

如果您只想为每个联系人显示一个项目,而不是每个 phone,您可以将 contactList 字段更改为 HashMap<Long, Contact> 而不是 List,并将新发现的 phones 添加到现有 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
}

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

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条记录。并在下拉刷新实现中,获取更多关于下拉刷新回调事件的记录。希望对您有所帮助