Firestore聊天消息的顺序不正确?

问题描述

因此,我仍然是Firebase的新手,我只是从Firebase实时数据库切换到Firestore。 到目前为止,效果很好。 但是我的聊天应用中的消息有问题。 使用Firebase实时数据库,一切工作正常,但是使用Firestore则存在一些问题。我可以发送和显示消息,但是Firestore以某种方式更改了聊天的顺序。有人可以向我解释一下并提出解决方案吗?

错误的示例视频: https://youtu.be/KE28qK22DoQ

(适配器)MessageAdapter:https://hastebin.com/avoluximow.java

(模型)聊天:https://hastebin.com/secuvojoyu.java

这是我用于写入和读取数据的代码

private void sendMessage(String sender,String receiver,String message) {
    FirebaseFirestore db = FirebaseFirestore.getInstance();

    HashMap<String,Object> chat = new HashMap<>();
    chat.put("sender",sender);
    chat.put("receiver",receiver);
    chat.put("message",message);

    db.collection("chats").add(chat);
}

private void readMessages(final String myid,final String userid) {
    mChat = new ArrayList<>();
    FirebaseFirestore db = FirebaseFirestore.getInstance();

    db.collection("chats")
            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot value,@Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.w(TAG,"readMessages - Reading data Failed",e);
                        return;
                    }

                    mChat.clear();
                    for (QueryDocumentSnapshot document : value) {
                        Chat chat = document.toObject(Chat.class);
                        if (chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
                                chat.getReceiver().equals(userid) && chat.getSender().equals(myid)) {
                            mChat.add(chat);
                        }

                        messageAdapter = new MessageAdapter(MessageActivity.this,mChat);
                        recyclerView.setAdapter(messageAdapter);
                    }
                }
            });
}

解决方法

尝试添加新字段(发送消息时):

chat.put("created",Timestamp.now());

并将字段添加到您的实体Chat.java

private Timestamp created;

public Timestamp getCreated() {
    return created;
}

在创建适配器之前,请按以下字段对列表进行排序:

Chat chat = document.toObject(Chat.class);
if (chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
        chat.getReceiver().equals(userid) && chat.getSender().equals(myid)) {
    mChat.add(chat);
}
// sorting by date >
Collections.sort(mChat,new Comparator<Chat>() {
    @Override
    public int compare(Chat o1,Chat o2) {
        return o1.getCreated().compareTo(o2.getCreated());
    }
});
// ^
messageAdapter = new MessageAdapter(MessageActivity.this,mChat);
recyclerView.setAdapter(messageAdapter);