2016-03-26 2 views
7

Я знаю, как использовать FirebaseRecyclerAdapter по списку предметов в Firebase. Я также знаю, как получить данные Firebase из нескольких мест с использованием индексов. Но я не знаю, как объединить это с FirebaseRecyclerAdapter.Как использовать FirebaseRecyclerAdapter с динамической ссылкой в ​​Android?

У меня есть простая структура данных, где пользователи могут быть друзьями:

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

я использую уникальные идентификаторы для имен пользователей. В этом простом примере пользователь 1 и пользователь 2 являются друзьями. То, что я хочу сделать, - это получить список всех имен (и позже, возможно, больше), используя FirebaseRecyclerAdapter. Обычно я получаю список, получая идентификатор пользователя под «друзьями», а затем используя эти идентификаторы для перехода к их именам. В 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, вы получите только определить один URL. Адаптер создаст список, основанный на элементах в этом единственном месте.

Есть ли способ настроить адаптер так, чтобы он считывал данные из нескольких мест, так же, как в примере выше? Или есть способ сделать динамическую переменную ref, которая указывает только на идентификаторы пользователя, которые также хранятся в списке «друзей» текущего пользователя? Я думал об использовании метода equals(), но я не могу понять, как именно.

Другой способ хранения имен пользователей также в списке «друзей». Но это не улучшит структуру данных. Мне приходилось менять имена в двух местах каждый раз (и, может быть, позже позже), и это приведет к большей избыточности.

У кого-нибудь есть решение этой проблемы? Я не мог найти ответ нигде, но это похоже на общую картину. И, кроме того, что он работает, как мне это сделать эффективно?

ответ

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) { } 
     }); 
    } 
}; 

Я добавил activity Activity36235919 to demonstrate this к моему sample repo.

После того, как я сделал это, я понял, что ответил на это раньше в Coupling FirebaseRecyclerViewAdapter to a Boolean/String Map.Entry, поэтому я буду отмечать ваш вопрос как дубликат.

+0

Перед тем, как использовать метод, описанный в этом ответе, пожалуйста, помогите с ним: http://stackoverflow.com/q/41921120/6144372 –

+0

Я выяснил проблему, которая вызывала сбой, как указано в моем предыдущем вопросе ... Я поставил еще один вопрос, основанный на этой проблеме. Пожалуйста, обратите внимание: http://stackoverflow.com/q/41925181/6144372 Спасибо! –