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
相关产品推荐
相关产品推荐

