2017-12-23 8 views
-2

だけを印刷するので、コードはこのようになります。完成したメンバーリスト

問題は、複数のログプリントを取得することです。しかし、私は完全な、完了したmeberListだけが必要です。

for (String memberByNumber : memberListByNumber) { 
        mFirebaseDatabaseReference.child("userUidsByNumber/").child(memberByNumber).addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          if (dataSnapshot.exists()) { 
           String userUid = dataSnapshot.getValue().toString(); 
           memberList.add(userUid); 

           Log.d("LOL", "ContactsAdapter: " + memberList); 
          } else { 
           Snackbar.make(view, R.string.user_does_not_exist, Snackbar.LENGTH_LONG).show(); 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 
          Snackbar.make(view, R.string.error, Snackbar.LENGTH_LONG).show(); 
         } 
        }); 
       } 

私の問題を理解して助けてくれることを願っています。 ありがとうございます。

+0

すべてのエントリをログオンするように設定すると、複数の出力が得られます – Zoe

+0

@Zoe Yeah、しかし、完了したmemberListだけを取得する方法はありますか? – marcelo

答えて

0

onDataChangememberListByNumberのためのすべてのメンバーのために呼び出された場合は、あなたが試すことができますするために使用

final int total = memberListByNumber.size(); 
for (String memberByNumber : memberListByNumber) { 
    mFirebaseDatabaseReference 
      .child("userUidsByNumber/") 
      .child(memberByNumber) 
      .addValueEventListener(new ValueEventListener() { 
     int n = total; 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.exists()) { 
       String userUid = dataSnapshot.getValue().toString(); 
       memberList.add(userUid); 
       if (--n <= 0) Log.d("LOL", "ContactsAdapter: " + memberList); 
      } else { 
       Snackbar.make(view, R.string.user_does_not_exist, Snackbar.LENGTH_LONG).show(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Snackbar.make(view, R.string.error, Snackbar.LENGTH_LONG).show(); 
     } 
    }); 
} 
0

私はそう ここに起因する私の評判にできなかったことをコメントしたいが、それだけで、必要な項目を印刷するはるかに困難ので、別の道に行かせるように、ここに私の答えあなたのロギングが一つのファイルにすべてのエントリですそして既存の1の1以上のif-else文を与えるとしてみてください-例外をいくつかのキャッシュメモリに完成し、キャンセルを分割して、完成したファイルを無効に

0

firebaseでは、完全なリストとしては決して何もありません。

いずれかの子ノードでデータが変更されるたびに、値イベントが発生し続けます。また、値イベントは、すべての子イベントが終了した後、すなわちその時点のすべての子ノードが存在することを確実にする直前に発生します。次回のイベントでは、その特定の時点で完全なリストが表示されます。

各データ変更呼び出しで、リストを消去し、すべての新しい値を追加して印刷することができます。これが火災の仕組みです。

リスト全体を一度しか変更したくない場合は、addListenerForSingleValueEventメソッドを使用してバリューイベントリスナーを追加できます。今度はリストは一度だけ読み込まれます。ただし、永続性を有効にしている場合、データは電話機のキャッシュから一度だけ読み込まれ、dbから読み取られません。

おそらくあなたが探しているのはより細かい制御を与えるChildEventListenerです。これにより、子が追加、削除、変更されたイベントが表示され、リストデータが一度に1つずつ子どもに表示されます。

あなたの実際の目的がわからないので、これは私が説明しようとすることができる最高です。これが役に立ちますようにお願いします。

関連する問題