2016-03-26 12 views
7

Firebaseの項目のリストにFirebaseRecyclerAdapterを使用する方法を知っています。インデックスを使用して複数の場所からFirebaseデータを取得する方法も知っています。しかし、これをFirebaseRecyclerAdapterと組み合わせる方法はわかりません。AndroidでFirebaseRecyclerAdapterを動的参照で使用するにはどうすればよいですか?

私は、ユーザーが友達になることができ、簡単なデータ構造を有する:私は、ユーザー名の一意のIDを使用し

"users": { 
    "user1": { 
    "name": "name", 
    "friends": { 
     "user2": "true" 
     } 
    } 
    "user2": { 
    "name": "name", 
    "friends": { 
     "user1": "true" 
     } 
    } 
    } 

を。この単純な例では、ユーザー1とユーザー2は友達です。私がやりたいことは、FirebaseRecyclerAdapterを使ってすべての名前のリストを取得することです。通常、私は "友人"の下にユーザーIDを取得し、それらのIDを使用して自分の名前に移動することによってリストを取得します。 Javaでは、それは次のようになります。

Firebase ref = new Firebase("<reference>"); 
ref.child("users/user1/friends").addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    String userId = snapshot.getKey(); 
    ref.child("users/" + userId + "/name").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
     System.out.println(snapshot.getValue()); 
     } 
     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
     // Do something here 
     } 
    }); 
    } 
}); 

しかしFirebaseRecyclerAdapterを使用しているとき、あなたは1つのURLのみを定義するために取得します。アダプターは、その単一の場所にある項目に基づいてリストを作成します。

上記の例と同じように、複数の場所からデータを読み取るようにアダプタを調整する方法はありますか? また、現在のユーザーの "friends"リストにも格納されているユーザーIDのみを指す動的なref変数を作成する方法はありますか?私はequals()メソッドを使用することを考えていましたが、正確にどのように正確に把握することはできません。

「友人」リストにもユーザー名を格納する別の方法があります。しかし、それはデータ構造を改善しません。私は毎回2つの場所で名前を変更しなければならないだろう(そして、後で写真があるかもしれない)。そしてそれはより多くの冗長性を導入するだろう。

誰にもこの問題の解決策がありますか?私はどこでも答えを見つけることができませんでしたが、それは共通のパターンのようです。そしてそれを機能させるだけでなく、効率的なやり方を教えてください。

答えて

11

addListenerForSingleValueEvent()を添付してデータに参加する必要があります。

FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder> adapter = new FirebaseRecyclerViewAdapter<Boolean, ItemViewHolder>(
    Boolean.class, android.R.layout.two_line_list_item, ItemViewHolder.class, friendsRef){ 
    protected void populateViewHolder(final ItemViewHolder viewHolder, Boolean model, int position) { 
     String key = this.getRef(position).getKey(); 
     ref.child("users").child(key).addListenerForSingleValueEvent(new ValueEventListener() { 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String name = dataSnapshot.child("name").getValue(String.class); 
       ((TextView)viewHolder.itemView.findViewById(android.R.id.text1)).setText(name); 
      } 

      public void onCancelled(FirebaseError firebaseError) { } 
     }); 
    } 
}; 

私は私のsample repoactivity Activity36235919 to demonstrate thisを追加しました。

私はこれを前にCoupling FirebaseRecyclerViewAdapter to a Boolean/String Map.Entryに回答していたことに気がついたので、私はあなたの質問を重複としてマークします。

+0

この回答に記載されている方法を使用した後に問題が発生しました...お手伝いをしてください:http://stackoverflow.com/q/41921120/6144372 –

+0

私は、クラッシュを引き起こしていた問題を、私の以前の質問で...私はその問題に基づいて別の質問を掲載しました。見てみることを検討してください:http://stackoverflow.com/q/41925181/6144372ありがとう! –

関連する問題