[英]Chats aren't being added to the ArrayList even though I can see that they are being saved to Firebase
希望有人可以帮助我解决此代码的逻辑。 我正在尝试实现聊天,并且我设置它的方式似乎应该可以正常工作并且流畅(如果没有,有人告诉我如何使它变得更好),但无论如何,我可以看到聊天是被添加并保存到Firebase
就好了,但问题是由于某种原因它们没有被添加到ArrayList
中,以便用户可以看到他们从其他人发送或接收的聊天。
有人可以告诉我我的代码的哪一部分错了,以便我可以修复它吗?
按照我的设置方式,这不是一个糟糕的流程,是吗?
MessagesActivity在这里我将聊天添加到 Firebase
final DatabaseReference chatReference = FirebaseDatabase.getInstance().getReference("Chat List").child("Sender").child(mFirebaseUser.getUid()).child("Receiver").child(mId);
chatReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (!dataSnapshot.exists()) {
chatReference.child("Receiver").setValue(mId);
chatReference.child("Timestamp").setValue(ServerValue.TIMESTAMP);
chatReference.child("Sender").setValue(mFirebaseUser.getUid());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
final DatabaseReference chatReferenceReceiver = FirebaseDatabase.getInstance().getReference("Chat List").child("Receiver").child(mId).child("Sender").child(mFirebaseUser.getUid());
chatReferenceReceiver.child("Receiver").setValue(mId);
chatReferenceReceiver.child("Timestamp").setValue(ServerValue.TIMESTAMP);
chatReferenceReceiver.child("Sender").setValue(mFirebaseUser.getUid());
ChatFragment此处应将聊天添加到 ArrayList
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Chat List").child("Sender").child(mFirebaseUser.getUid()).child("Receiver");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mChatList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Chatlist chatlist = snapshot.getValue(Chatlist.class);
mChatList.add(chatlist);
}
if (mChatList.size() == 0) {
mNoMessages.setVisibility(View.VISIBLE);
} else {
mNoMessages.setVisibility(View.GONE);
chatList();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
所以谷歌是你的朋友。 其他人过去一直在努力解决这个问题,例如有文章/帖子。 中等,所以给出想法。 我喜欢和使用的那个 - 复制别人的好作品并不羞耻:-) 在这篇 Medium 帖子中: https://medium.com/@ngengesenior/database-structure-of-one-to-one-chat-应用程序与firebase-93f813184dfe
它涵盖了 Firestore 和 RTDB。 基本上,对于 RTDB,您的聊天列表是使用两个用户 ID 的连接(复合)键来管理的,这两个用户 ID 在创建键之前按字母顺序排序,例如。 userid1 = xxxx,userid2 = bbbb,复合键为 bbbbxxxx(FB 用户 ID 为 28 个字符长,因此复合键为 56 个字符)。 这样,通过一个数据库读取复合键,您可以获得这两个用户之间的所有聊天消息,无论哪一个是发送者或接收者。 您在消息上保留一个 bool 指示符,说明复合键中的第一个用户 ID 是否是发送者,并且使用该信息您可以解析复合键以确定发送者和接收者的用户 ID - 这是我对中描述的内容的改进在这篇文章中,他仍然将发送者和接收者的 ID 存储为属性。 减少了大量的数据重复,并应简化处理聊天所需的代码。 我不使用 Java 所以无法帮助您使用代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.