为什么多次触发onChildAdded?

时间:2018-03-22 04:41:16

标签: android firebase android-recyclerview

我的代码有问题,因为onChildAdded或RecyclerView我不知道是否得到它

简单我想在RecyclerView上显示收件箱,其中包含我从其他用户收到的所有邮件,每封邮件包含最后发送的邮件以及有关发件人的信息,例如他的姓名和照片。

喜欢这个

这是我的结构

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个发件人具有相同的先前案例,依此类推。

我该如何解决?

我的意思是如果新邮件已经存在于我的收件箱列表

中,我该如何向用户添加新邮件

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

1 个答案:

答案 0 :(得分:1)

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

你可以做什么?

1:检查结果列表是否包含对象,否则添加否则忽略。

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

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