如何基于最新消息时间对Firebase实现的Android聊天列表进行排序
聊天列表按最新对话时间整体排序方案
问题原因
你当前的sortUsers方法仅将最新一条消息对应的用户移到了列表首位,剩余用户完全没有做排序处理,所以剩下的聊天项顺序还是原始的随机顺序。
修复步骤
1. 先修正Chat类的字段类型
你当前Chat类中time字段定义为String,但实际存储的是long类型的时间戳,先做修改避免类型转换错误:
public class Chat { private String sender; private String receiver; private String message; // 把String改成long,和你存储的时间戳类型匹配 private long time; private String type; private boolean isseen; // 构造方法对应修改参数类型 public Chat(String sender, String receiver, String message, long time, String type, boolean isseen){ this.sender = sender; this.receiver = receiver; this.message = message; this.time = time; this.type = type; this.isseen =isseen; } // 对应的getTime()方法返回值也改成long public long getTime() { return time; } // 其他get/set保持不变 }
2. 重写sortUsers方法实现整体排序
核心逻辑是先为每个聊天用户统计最新的对话时间,再按这个时间对整个用户列表做降序排序:
private void sortUsers() { // 临时Map存储 对端用户ID -> 最新对话时间戳 HashMap<String, Long> userLastTimeMap = new HashMap<>(); String currentUid = fUser.getUid(); // 遍历所有自己相关的聊天消息,更新每个用户的最新对话时间 for (Chat chat : mChats) { // 获取对端用户ID String targetUid = chat.getSender().equals(currentUid) ? chat.getReceiver() : chat.getSender(); long chatTime = chat.getTime(); // 如果该用户还没有记录,或者当前消息时间比已记录的时间更新,就更新 if (!userLastTimeMap.containsKey(targetUid) || chatTime > userLastTimeMap.get(targetUid)) { userLastTimeMap.put(targetUid, chatTime); } } // 对mUsers列表做整体排序,按最新对话时间降序排列 Collections.sort(mUsers, new Comparator<User>() { @Override public int compare(User u1, User u2) { long time1 = userLastTimeMap.getOrDefault(u1.getId(), 0L); long time2 = userLastTimeMap.getOrDefault(u2.getId(), 0L); // 降序排列:时间大的在前 return Long.compare(time2, time1); } }); // 通知适配器刷新 usersAdapter.notifyDataSetChanged(); }
性能优化建议
你现在的实现每次都要遍历所有的Chats节点,当聊天消息量很大的时候会有性能问题。建议直接在Chatlist节点下新增lastTime字段,每次发送/接收消息的时候,同步更新会话双方Chatlist节点下的lastTime值,这样你获取聊天用户列表的时候就可以直接在Chatlist的查询里做排序,不需要再遍历所有聊天消息,性能会好很多。
内容的提问来源于stack exchange,提问作者SSS
相关产品推荐
相关产品推荐

