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

如何基于最新消息时间对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:30:04