我正在从特定的FirebaseDatabase
引用中检索一些数据并尝试将其添加到ArrayList<String>
中,但发生了一些奇怪的事情,因为它们没有一个接一个地添加。
onCreate()
中的某个地方:
pA = new ArrayList<>();
这是我的代码:
aRef.child(reID).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
Map<String, String> map = (Map<String, String>) childSnapshot.getValue();
if (pA != null){
pA.clear();
}
pA.add(map.get("pA"));
Log.d("pA", String.valueOf(pA));
}
} else {
Toast.makeText(getBaseContext(), "no data available yet", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
这是数据结构:
-app
-child
-reID
-uniqueID1
-userID1
-key: value
-key: value
-pA: value1
-uniqueID2
-userID2
-key: value
-key: value
-pA: value2
-uniqueID3
-userID3
-key: value
-key: value
-pA: value3
以下是登出的内容:
D/pA: [value1]
D/pA: [value2]
D/pA: [value3]
我尝试删除if (pA != null) {pA.clear();}
,但后来我得到了这个日志:
D/pA: [value1, value1, value2, value1, value2, value3]
我想要的是:
D/pA: [value1, value2, value3]
请告诉我这里出了什么问题,我怎样才能达到上述结果?
答案 0 :(得分:1)
值监听器在firebase中的工作方式,尤其是您使用它的方式,如果将一个子节点添加到您正在侦听的节点,您将再次接收所有子节点。这就是为什么如果你不清除arraylist,你得到value1,value1,value2,value1,value2,value3。添加第一个value1,然后当value2添加到firebase时,您的侦听器会收到一个包含两者的对象。
此方法在连接侦听器时触发一次,并且每次包括子项在内的数据发生更改时再次触发。事件回调传递一个快照,其中包含该位置的所有数据,包括子数据。 Firebase Documentation
<强>解决方案强>
在不更改代码的情况下解决此问题的最简单方法是在for循环之外清除pA。这样,每次事件发生时,您都会获得所有当前现有的&#39; pA&#39;:s。
if (dataSnapshot.getValue() != null) {
if (pA != null){
pA.clear();
}
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
.
.
.