2017-04-25 4 views
0

私はアンドロイドのアプリケーションや何か奇妙発生しましたでfirebaseで働いた後、空になりますユーザーのキーを持つ文字列)と、もう一方はユーザーと比較するために、奇妙な振る舞いは、最初のスナップショットの後に私のarraylistが空であることを確認するためにlogcatを使用し、firstsnapshotのログは、 arraylist、2番目は私に0を返す、それは再び0になる方法を知らない。ここでArrayListのは、私の例では、私は(私はのArrayListのを埋めるために、このスナップショットを使用して、リスト内のユーザーを取得するには2つのスナップショット、1を必要とする最初のスナップショット

が私のコードです:それはなぜ起こるか私は、任意の先端をArrayListの内部キーを追加しているので、

private void prepareFriendList() { 
     myRef.child(id).child("FriendLists").child(group).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String keyUser; 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        Log.d("number:",snapshot.getKey()); 
        keyUser = snapshot.getKey(); 
        currentFriends.add(keyUser); 
        Log.d("hello",String.valueOf(currentFriends.size())); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     for(String s: currentFriends){ 
      Log.d("idddd",s); 
     } 

     Log.d("hello",String.valueOf(currentFriends.size())); 



     myRef.child(id).child("Users").addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 

        User user = snapshot.getValue(User.class); 

        for(String item: currentFriends){ 
         if (snapshot.getKey().equals(item)) { 
          usersList.add(user); 
         } 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     mAdapter.notifyDataSetChanged(); 
    } 

私は、理解していませんか?

答えて

1

これは、onDataChangeが非同期に呼び出されるために発生します。つまり、ユーザをlistに追加する文は、onDataChangeが呼び出される前に実行されます。だからあなたのlistはそのメソッドの外側で空です。そのリストを使用するには、onDataChange()メソッドの中でそれを使用する必要があります。

他のアプローチでは、このpostこのpostをご覧ください。

希望します。

+0

さて、私はあなたの応答をありがとうございました、しかし、事は、私はのonchangeの内側に私の2番目のリスナーを入れてみました2つのdiferent参照を必要とするので、私は、リスナー内でリスナーを実装することはできませんが、それが入ることはありません、問題を理解しますそこに:任意の提案? –

+0

はい、ネストされた 'listeners'を使うことができます。各リスナーが特定の '参照 'を持つ限り、問題はありません。最後に、このようなあなたの 'onDestroy'方法で' listeners'削除することを忘れないでください: 'yourReference.removeEventListener(valueEventListenerを);' –

+0

あなたは私が最初に内部の私の2番目の「myRef」コード」を置くことができる方法を例示することができます私はそれを試して、それは動作しません:/ –

関連する問題