2017-02-01 9 views
2

特定のFirebaseDatabase参照からデータを取得していて、ArrayList<String>に追加しようとしていますが、次々と追加されていないので、何か不思議です。どこかonCreate()FirebaseDatabaseリファレンスのすべてのデータがArrayListに追加されないのはなぜですか?<String>?

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

コードの配列リストはどこですか?そしてpAは何ですか? –

+0

@MrunalAhirrao 'pA'はarraylistです。更新された質問をご覧ください。 –

+0

@ cricket_007この問題で助けてください –

答えて

1

ファイヤーベースでの値リスナーの使用方法、特に使用している方法で、子ノードがリスンしているノードに子ノードが追加されると、再びすべての子ノードが受信されます。これは、arraylistをクリアしないとvalue1、value1、value2、value1、value2、value3を取得する理由です。最初のvalue1が追加され、value2がfirebaseに追加されると、リスナーは両方のオブジェクトを受け取ります。

このメソッドは、リスナーがアタッチされると1回トリガーされ、子を含むデータが変更されるたびにトリガーされます。イベントコールバックには、その場所にある子データを含むすべてのデータを含むスナップショットが渡されます。 Firebase Documentation

ソリューション

あなたは多くのコードに変更することなく、この問題を解決するための最も簡単な方法は、forループの外でのpAをクリアすることです。そうすれば、イベントが発生するたびに、現在存在する「pA」のすべてを取得できます。

if (dataSnapshot.getValue() != null) { 
     if (pA != null){ 
      pA.clear(); 
     } 
     for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { 
. 
. 
. 
関連する問題