Android 为什么不将FirebaseDatabase引用中的所有数据添加到ArrayList中<;字符串>;?
我正在从一个特定的Android 为什么不将FirebaseDatabase引用中的所有数据添加到ArrayList中<;字符串>;?,android,arraylist,firebase,firebase-realtime-database,Android,Arraylist,Firebase,Firebase Realtime Database,我正在从一个特定的FirebaseDatabase引用中检索一些数据,并试图将其添加到ArrayList中,但由于没有一个接一个地添加这些数据,因此出现了一些奇怪的情况 在onCreate()中的某处 以下是要注销的内容: D/pA: [value1] D/pA: [value2] D/pA: [value3] 我试图删除如果(pA!=null){pA.clear();},但后来我得到了以下日志: D/pA: [value1, value1, value2, value1, value2, v
FirebaseDatabase
引用中检索一些数据,并试图将其添加到ArrayList
中,但由于没有一个接一个地添加这些数据,因此出现了一些奇怪的情况
在onCreate()中的某处
以下是要注销的内容:
D/pA: [value1]
D/pA: [value2]
D/pA: [value3]
我试图删除如果(pA!=null){pA.clear();}
,但后来我得到了以下日志:
D/pA: [value1, value1, value2, value1, value2, value3]
我想要的是:
D/pA: [value1, value2, value3]
请让我知道这里出了什么问题,以及如何实现上述给定结果?firebase中值侦听器的工作方式,特别是您使用它的方式,如果将一个子节点添加到您正在侦听的节点,您将再次接收所有子节点。这就是为什么如果不清除arraylist,会得到value1、value1、value2、value1、value2、value3。首先添加value1,然后当value2添加到firebase时,您的侦听器将收到一个同时包含这两个值的对象
此方法在附加侦听器时触发一次,在每次数据(包括子项)更改时触发一次。事件回调传递一个快照,其中包含该位置的所有数据,包括子数据。
解决方案
在不更改太多代码的情况下修复此问题的最简单方法是在for循环之外清除pA。这样,每次触发事件时,您将获得当前存在的所有“pA”:s
if (dataSnapshot.getValue() != null) {
if (pA != null){
pA.clear();
}
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
.
.
.
数组列表在代码中的什么位置?什么是pA?@MrunalAhirraopA
是arraylist。请查看更新的问题。@cricket_007请帮助解决此问题您是否尝试将if(pA!=null){pA.clear();}
移动到for
循环之前(之外)?
D/pA: [value1, value1, value2, value1, value2, value3]
D/pA: [value1, value2, value3]
if (dataSnapshot.getValue() != null) {
if (pA != null){
pA.clear();
}
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
.
.
.