为什么不将所有来自FirebaseDatabase引用的数据添加到ArrayList <string>中?

时间:2017-02-01 03:24:35

标签: android arraylist firebase firebase-realtime-database

我正在从特定的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]

请告诉我这里出了什么问题,我怎样才能达到上述结果?

1 个答案:

答案 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()) {
 .
 .
 .