【问题标题】:Firestore chat messages are not in the right order?Firestore 聊天消息的顺序不正确?
【发布时间】:2020-11-30 07:14:56
【问题描述】:

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

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

(适配器)消息适配器: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);
                    }
                }
            });
}

【问题讨论】:

  • 同时添加您的适配器代码
  • 这里你可以找到一个完整且功能齐全的Firestore Chat App的解决方案,在这里解决了排序消息的问题。
  • @AlexMamo 第一次:我使用 Java,第二次:我想了解问题所在,而不仅仅是从视频中复制。
  • @AnujKumar 我现在就去做
  • @Grabenkind 您需要按日期对 mChat 集合进行排序 - stackoverflow.com/a/37291086/2738172,如果您没有消息的日期/时间,您可以在数据库中添加此字段。

标签: android google-cloud-firestore


【解决方案1】:

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

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);

【讨论】:

  • 您的解决方案没有一个问题,一切都很完美。非常感谢!
猜你喜欢
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2021-07-06
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多