【问题标题】:Android FirebaseDatabase after Data Change, values are shown twice [duplicate]数据更改后的Android FirebaseDatabase,值显示两次[重复]
【发布时间】:2019-03-13 13:29:56
【问题描述】:

如果我的数据库发生变化,总是会显示旧值和新值。我怎样才能删除旧的并只显示新的。这是我的代码:

 private void downloadAccepted(final String plz) {
    String userid = 
FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users").child(userid).child("acceptedEvents");
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                downloadAcceptedDetails(plz, snapshot.getKey().toString());
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
private void downloadAcceptedDetails(final String plz, final String id){

    DatabaseReference refi = FirebaseDatabase.getInstance().getReference().child("Events").child(plz).child(id);
    refi.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Long millis =  new Date().getTime();
            if (dataSnapshot.getChildrenCount() > 0 ) {
                if (Long.parseLong(dataSnapshot.child("ts").getValue().toString()) > millis) {
                    EventObject eo = new EventObject(dataSnapshot.child("ts").getValue().toString(), dataSnapshot.child("name").getValue().toString(), dataSnapshot.child("street").getValue().toString(), dataSnapshot.child("plz").getValue().toString());
                    accepted.add(eo);
                    try{
                        ((globalVariable) getActivity().getApplication()).setAdapter2(adapter2);
                    }catch (Exception e){

                    }
                    adapter2.notifyDataSetChanged();
                } else {
                    removeValuesMyIdeas( plz, id);
                }

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

并且总是调用我的 downloadAccepted 中的 onData Change。我已经尝试在之前的方法中执行以下操作:

accepted = new ArrayList();

不幸的是,如果我将此行添加到这两种方法之一,则始终不会显示任何内容。

【问题讨论】:

    标签: android firebase-realtime-database


    【解决方案1】:

    Pavneet's approach 有效,但这意味着只要任何子项发生更改,您就会刷新整个列表。如果您想要更精细的更新,您需要使用ChildEventListener,它会告诉您添加、删除、修改或移动了哪些子节点。

    您分享的第一个监听器的简单示例:

    ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildKey) {
            downloadAcceptedDetails(plz, dataSnapshot.getKey().toString());
        }
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            // TODO: remove `dataSnapshot.getKey()` from the list
        }
        public void onChildChanged(DataSnapshot dataSnapshot, String previousChildKey) {
            // TODO: update `dataSnapshot.getKey()` in the list
        }
        public void onChildMoved(DataSnapshot dataSnapshot, String previousChildKey) {
            // TODO: move `dataSnapshot.getKey()` in the list
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore exceptions
        }
    });
    

    另见working with lists of data

    【讨论】:

      【解决方案2】:

      在开始处理响应之前使用accepted.clear() 删除旧数据

         ref.addValueEventListener(new ValueEventListener() {
              @Override
              public void onDataChange(DataSnapshot dataSnapshot) {
      
                  accepted.clear();
                  //^^^^^^^^^^^^^^
                  for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                      downloadAcceptedDetails(plz, snapshot.getKey().toString());
                  }
              }
      
              @Override
              public void onCancelled(DatabaseError databaseError) {
      
              }
          });
      

      【讨论】:

        猜你喜欢
        • 2021-11-24
        • 2020-08-15
        • 2022-10-12
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 2022-12-07
        • 2022-12-11
        • 1970-01-01
        相关资源
        最近更新 更多