仅显示一定数量的联系人
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条记录。并在下拉刷新实现中,获取更多关于下拉刷新回调事件的记录。希望对您有所帮助
我开发了一个程序,可以显示我 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条记录。并在下拉刷新实现中,获取更多关于下拉刷新回调事件的记录。希望对您有所帮助