如何在android studio中显示按地址排序的联系人姓名和号码

Posted

技术标签:

【中文标题】如何在android studio中显示按地址排序的联系人姓名和号码【英文标题】:How to display contact name and number sorted by address in android studio 【发布时间】:2021-11-30 03:50:59 【问题描述】:

我必须在回收站视图中显示联系人姓名和电话号码。但是,排序顺序应该是按地址排序,这意味着如果一个联系人保存了地址,那么它应该在回收站视图中显示在第一位,然后是没有地址的联系人。所有代码都在工作。我不知道如何按地址排序,然后在回收站视图中显示。

代码是: 公共无效 getContactList()

    Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;

    ContentResolver resolver = getContentResolver();

    Cursor cursor = resolver.query(phoneUri, null, null, null, sortOrder);

    if (cursor.getCount() > 0) 
        while (cursor.moveToNext()) 

            contact= new Contact();
            contact.setName(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
            contact.setNumber(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)));
            contact.setContactId(cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Data.CONTACT_ID)));

            contact.setAddresses(getAddressesByContactId(contact.getContactId()));

            contactList.add(contact);

        
    

    cursor.close();


    setContactsRecyclerView();

私有 ArrayList getAddressesByContactId(long contactId)

    Uri addressUri = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI;
    String sortOrder = ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS;

    String addressSelection = ContactsContract.Data.CONTACT_ID + "=" + contactId;

    Cursor addressCursor = getContentResolver().query(addressUri, null, addressSelection, null, sortOrder);

    ArrayList<String> addresses = new ArrayList<>();

    if (addressCursor.getCount() >0) 

        while (addressCursor.moveToNext()) 

            addresses.add(addressCursor.getString(addressCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)));
        

    
    addressCursor.close();

    return addresses;

私人无效 setContactsRecyclerView()

    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    recyclerViewAdapter = new RecyclerViewAdapter(this, contactList);

    recyclerView.setAdapter(recyclerViewAdapter);

【问题讨论】:

【参考方案1】:

您只需对contactList 进行排序,然后再将其设置为recyclerViewAdapter

这是一个示例排序函数:

Collections.sort(contactList, new Comparator<Contact>() 
    @Override
    public int compare(Contact a, Contact b) 
        String address1 = (a.getAddresses().isEmpty() ? null : a.getAddresses().get(0);
        String address2 = (b.getAddresses().isEmpty() ? null : b.getAddresses().get(0);

        int addressCompare = StringUtils.compare(address1, address2, false);

        if (addressCompare != 0) 
            return addressCompare;
        

        return StringUtils.compare(a.getName(), b.getName(), false);
    
);
如果有多个地址,只按第一个排序 我使用的是 apache 的 StringUtils for null-safe string compare,带有一个布尔值,表示 null 应该位于顶部还是底部。

【讨论】:

以上是关于如何在android studio中显示按地址排序的联系人姓名和号码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中制作搜索框

如何在android studio的textview中显示用户Android Mac地址

如何在 Android Studio 中使用按钮按初始筛选并使用 SQLite 将其显示在另一个活动上

按字母顺序排序音乐播放器的播放列表(Android Studio)

如何根据用户在Android Studio(Java)中输入的条件显示可绘制对象

用户按下排序按钮后如何在列表视图中显示排序列表?