You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio实现RecyclerView中联系人按是否有地址优先排序展示

实现方案

你已经完成了联系人数据的全量加载,仅需在初始化RecyclerView之前对contactList按规则排序即可,无需修改原有查询逻辑,具体改动如下:

1. 新增自定义排序逻辑

在cursor.close()之后、setContactsRecyclerView()之前插入排序代码:

cursor.close();

// ========== 新增排序逻辑开始 ==========
Collections.sort(contactList, new Comparator<Contact>() {
    @Override
    public int compare(Contact contactA, Contact contactB) {
        // 判断两个联系人是否有存储的地址
        boolean aHasAddress = contactA.getAddresses() != null && !contactA.getAddresses().isEmpty();
        boolean bHasAddress = contactB.getAddresses() != null && !contactB.getAddresses().isEmpty();
        
        // 有地址的联系人优先排在前面
        if (aHasAddress && !bHasAddress) {
            return -1;
        }
        if (!aHasAddress && bHasAddress) {
            return 1;
        }
        // 同优先级(都有地址/都没有地址)的联系人保持原有的按姓名排序规则
        return contactA.getName().compareTo(contactB.getName());
    }
});
// ========== 新增排序逻辑结束 ==========

setContactsRecyclerView();

2. 可选简化写法(Java 8+支持)

如果你的项目兼容Java 8及以上版本,可以用lambda表达式简化排序代码:

Collections.sort(contactList, (a, b) -> {
    boolean aHasAddress = a.getAddresses() != null && !a.getAddresses().isEmpty();
    boolean bHasAddress = b.getAddresses() != null && !b.getAddresses().isEmpty();
    if (aHasAddress != bHasAddress) {
        return aHasAddress ? -1 : 1;
    }
    return a.getName().compareTo(b.getName());
});

扩展说明

如果需要对有地址的联系人内部再按地址内容排序,只需在同优先级判断分支中补充地址字段的比较逻辑即可。

内容的提问来源于stack exchange,提问作者Hamad Zaheen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:15:04