如何解决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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。