我的代码有问题,我不知道是否由于onChildAdded或RecyclerView而得到它

我只是想在RecyclerView上显示消息收件箱,其中包含我从其他用户收到的所有消息,每条消息都包含最近发送的消息以及有关发件人的信息,例如其姓名和照片。

像这样

android - 为什么onChildAdded被多次触发?-LMLPHP

这是我的结构

Messages
  Receiver_UID
     Sender_UID
        push
          message : "text"


我使用2个嵌套查询来实现
所以首先我得到了发件人的UID,然后又从另一个查询中得到了最后一条消息

dataQuery = FirebaseDatabase.getInstance().getReference("Messages").child(my_Id);
    dataQuery.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot getalldata, String s) {

            final String sender_UID = getalldata.getKey();

            Query lastmess = FirebaseDatabase.getInstance().getReference("Messages").child(my_Id).child(sendUID);
            lastmess.orderByKey().limitToLast(1).addChildEventListener(new ChildEventListener() { // last message
                @Override
                public void onChildAdded(DataSnapshot snap, String s) {
                    MessModel messages = snap.getValue(MessModel.class);
                    String Last_message = messages.getMessage();
                    getUserData(Last_message ,sender_UID);

                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {


        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


最后我通过这种方法获得了发件人的信息

private void getUserData(final String last_message , String sendUID) {
    FirebaseDatabase.getInstance().getReference("Users").orderByKey().equalTo(sendUID).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(final DataSnapshot data, final String s) {

            listImessagesitem model = data.getValue(listImessagesitem.class);
            name =model.getName();
            uid = model.getUid();
            //another information

            result.add( new listImessagesitem( name ,last_message ,uid, ... another info));
            useradapter = new listMessagesAdapter(getActivity(),result);
            myList.setAdapter(useradapter);
            useradapter.notifyDataSetChanged();

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }

    });
}


第一次和刷新时效果都很好

问题是某人在“收件箱”邮件列表中向我发送了新邮件。在这种情况下,如果我不刷新,则会看到两个发件人,它们的信息相同,而最后一条消息却不同。如果再次发送,我会看到3个发件人,其前一种情况相同,依此类推。

我该如何解决?

我的意思是,如果我的收件箱列表中已经存在新消息,该如何向用户添加新消息

任何帮助,将不胜感激,谢谢

最佳答案

通过查看您的代码,我了解到您嵌套了ChildEventListener。因此,每次调用顶部侦听器时,都会创建一个新的内部子侦听器,从而在调用getUserData方法更新适配器时导致重复数据。

你可以做什么?

1:检查结果列表是否包含对象(如果没有),然后添加,否则忽略。

2:据我了解,我相信您正在尝试创建一个Mail Client应用程序,其中两个用户正在相互发送电子邮件。因此,为什么不为数据库中的两个用户创建单个节点,而不要使用数据库中的结构,例如user_1_ID + user_2_ID。

这降低了复杂性,因为这两个用户都将从同一个节点读取,并且消息对象应具有一个时间戳字段来确定最新消息。

关于android - 为什么onChildAdded被多次触发?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49420696/

10-12 00:11
查看更多