【问题标题】:Show only a certain number of contacts仅显示一定数量的联系人
【发布时间】:2017-12-04 10:43:09
【问题描述】:

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

    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 个联系人被加载到列表的末尾。等等

【问题讨论】:

  • 为此您需要实现拉动刷新功能
  • @AbdulWaheed 我如何首先限制下载的联系人数量?

标签: android android-recyclerview android-contentprovider android-contacts android-contentresolver


【解决方案1】:

使用以下具有限制原因的代码。用下面的代码替换你的代码

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

【讨论】:

  • 它有效,但是我如何在 OnLoadMoreListener 中下载接下来的 10 个联系人,因为我正在获取已经下载的联系人
  • 您将被要求记录您已加载的记录数量以及您想要的记录数量并相应更新
【解决方案2】:

我认为您想要这样做的原因是因为加载所有联系人非常慢。 它非常慢的原因是因为您目前每个联系人有 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();

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

类似:

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
}

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多