ArrayList<String> mKeys = new ArrayList<>();
ArrayList<Complaint> objectItems = new ArrayList<>();
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String key_use = dataSnapshot.getKey();
mKeys.add(key_use);
//some codes
objectItems.add(0, objectItem);
customListAdapter.notifyDataSetChanged();
}
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
String key_use = dataSnapshot.getKey();
int index = mKeys.indexOf(key_use);
//some codes
objectItems.set(index, objectItem);
customListAdapter.notifyDataSetChanged();
}
这很好用,但是onChildChanged中的set方法在更新记录后会创建重复的记录。它应该仅在该特定索引处更新记录
答案 0 :(得分:0)
您要在列表的末尾添加密钥,并在列表的开头添加对象。因此他们俩的位置不同
请将您的代码更改为
$('.sidebar a').click(function() {
sessionStorage.scrollTop = $('.sidebar').scrollTop();
});
if (sessionStorage.scrollTop != "undefined") {
$('.sidebar').scrollTop(sessionStorage.scrollTop);
}
答案 1 :(得分:0)
如果您使用过
FieldValue.serverTimestamp()
当您将其发送到数据库时。
它将同时创建子级serverTimestamp()子级,然后在onChildAdded上触发,然后在onChildChanged下触发。
弗兰克·范·普菲伦(Frank van Puffelen)在这里说firebase.database.ServerValue.TIMESTAMP fires child_changed twice, which one is correct?
第一个值是客户端估计。第二个值是来自服务器的值。除此之外,还不清楚您要问什么。如果没有看到能再现您要解决的问题的最小代码,就不可能说更多。 –弗兰克·范普菲伦
这就是为什么您有重复的记录。