繁体   English   中英

聊天没有被添加到 ArrayList 即使我可以看到它们被保存到 Firebase

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM