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
}
});
另见