Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android FirebaseDatabase数据更改后,值显示两次_Android_Firebase Realtime Database - Fatal编程技术网

Android FirebaseDatabase数据更改后,值显示两次

Android FirebaseDatabase数据更改后,值显示两次,android,firebase-realtime-database,Android,Firebase Realtime Database,如果我的数据库发生变化,总是会显示旧值和新值。如何删除旧的并仅显示新的。这是我的密码: private void downloadAccepted(final String plz) { String userid = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(

如果我的数据库发生变化,总是会显示旧值和新值。如何删除旧的并仅显示新的。这是我的密码:

 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) {

        }
    });
}
我的下载中的onData更改总是被调用。我以前已经尝试过在该方法中执行以下操作:

accepted = new ArrayList();

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

在开始处理响应之前,请使用
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) {

        }
    });

在开始处理响应之前,使用
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) {

        }
    });
有效,但意味着每当任何子项发生更改时,您都会刷新整个列表。如果您想要更细粒度的更新,您需要使用
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
    }
});
另请参见。

有效,但意味着每当任何子项发生更改时,您都会刷新整个列表。如果您想要更细粒度的更新,您需要使用
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
    }
});
另见