2016-03-26 25 views
7

So come usare uno FirebaseRecyclerAdapter in un elenco di elementi in Firebase. So anche come ottenere i dati Firebase da più posizioni utilizzando indici. Ma non so come combinarlo con un FirebaseRecyclerAdapter.Come utilizzare un FirebaseRecyclerAdapter con un riferimento dinamico in Android?

Ho una semplice struttura di dati in cui gli utenti possono essere amici:

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

ho utilizzare gli ID univoci per i nomi utente. In questo semplice esempio, l'utente 1 e l'utente 2 sono amici. Quello che voglio fare è ottenere un elenco di tutti i nomi (e più tardi in seguito) usando un FirebaseRecyclerAdapter. Normalmente, otterrei una lista ottenendo l'ID utente sotto "amici" e quindi usando quegli ID per navigare verso i loro nomi. In Java, sarebbe simile a questa:

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

Ma quando si utilizza un FirebaseRecyclerAdapter, si ottiene solo di definire un URL. L'adattatore creerà un elenco in base agli elementi in quel singolo luogo.

C'è un modo per regolare l'adattatore in modo che legga i dati da più posti, nello stesso modo in cui l'esempio sopra fa? Oppure esiste un modo per creare una variabile di riferimento dinamico che punti solo agli ID utente che sono anche memorizzati nell'elenco "amici" dell'utente corrente? Stavo pensando di usare il metodo equals(), ma non riesco a capire come esattamente.

Un altro modo sarebbe memorizzare i nomi utente anche nell'elenco "amici". Ma ciò non migliorerebbe la struttura dei dati. Dovrei cambiare i nomi in due posti ogni volta (e forse le foto sono in seguito) e introdurrebbe più ridondanza.

Qualcuno ha una soluzione per questo problema? Non ho potuto trovare una risposta da nessuna parte, ma sembra un modello comune. E oltre a farlo funzionare, come lo faccio in modo efficiente?

risposta

11

È necessario unire i dati, allegando un 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) { } 
     }); 
    } 
}; 

Ho aggiunto un activity Activity36235919 to demonstrate this al mio sample repo.

Dopo averlo fatto funzionare, mi sono reso conto che avevo già risposto prima in Coupling FirebaseRecyclerViewAdapter to a Boolean/String Map.Entry, quindi contrassegnerò la domanda come duplicata.

+0

di fronte a un problema dopo aver utilizzato il metodo che hai descritto in questa risposta ... per favore aiutaci con esso: http://stackoverflow.com/q/41921120/6144372 –

+0

ho capito il problema che stava causando crash come dichiarato nella mia domanda precedente ... ho pubblicato un'altra domanda basata su quel problema. Si prega di prendere in considerazione: http://stackoverflow.com/q/41925181/6144372 Grazie! –

Problemi correlati