2017-07-26 1 views
0

J'essaie d'interroger Firebase et de remplir un adaptateur de recycleur avec des données conditionnelles à partir de DataSnapshot de la requête. J'ai essayé de placer la fonction de remplissage à l'intérieur de l'instruction if qui enregistre correctement les données que je veux, mais la vue recycleur renvoie simplement tout à partir du nœud que je recherchais (la requête principale avec laquelle j'ai commencé). Des suggestions sur la façon de simplement remplir les éléments qui s'appliquent à l'instruction "if"? Je vous remercie!Android: Comment utiliser les valeurs DataSnapshot conditionnelles dans Firebase RecyclerView?

rootRef = FirebaseDatabase.getInstance().getReference(); 
    //below is the node i query 
    mAlbumQuery = rootRef.child(Constants.FIREBASE_CHILD_ALBUMS).orderByChild("genres"); 
    mAlbumQuery.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot reco : dataSnapshot.getChildren()) { 
       if (reco.getValue().toString().contains(mRecommendation.getGenre())) { 
        //below returns the items i want 
        Log.d("is this correct", reco.getValue().toString()); 
        //below returns everything in the original query 
        //how to populate only items that match the above? 
        mAdapter = new FirebaseRecyclerAdapter<Album, AlbumsViewHolder>(
          Album.class, 
          R.layout.album_cards, 
          AlbumsViewHolder.class, 
          mAlbumQuery) { 
         @Override 
         public void populateViewHolder(AlbumsViewHolder holder, Album album, int position) { 
          holder.bindView(album.getImage(), album.getTitle()); 
          if (!album.getGenres().contains(mRecommendation.getGenre())) { 
           //added as a hypothetical... should i have something in here? 
          } 
         } 
        }; 
        mAlbumsRecycler.setAdapter(mAdapter); 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
    return view; 
} 

Répondre

0

si vous voulez extraire un nœud particulier u peut utiliser: -

String notific = String.valueOf(dataSnapshot.getValue()); 

int key=dataSnapshot.getKey(); 
String title=String.valueOf(dataSnapshot.child("title").getValue()); 
String content=String.valueOf(dataSnapshot.child("content").getValue()); 
+0

Comment l'utiliser dans la vue Recycleur? – DarkKnightSDS

1

Eh bien, si vous envoyez mAlbumQuery comme param à votre FirebaseRecyclerAdapter, je crois, il faut sa taille que le nombre de articles.

En option (pour solution rapide) vous pouvez créer une nouvelle collection et à l'intérieur de cette boucle:

for (DataSnapshot reco : dataSnapshot.getChildren()) { 
} 

vous pouvez remplir cette nouvelle collection avec les éléments nécessaires.
Après la boucle, vous pouvez créer un nouvel adaptateur et lui transmettre la collection filtrée.

Voici comment je vois ceci:

@Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Collection<> myNewCollection = new Collection<>(); //HashMap, ArrayList - depends on what you are storing in Firebase 
      for (DataSnapshot reco : dataSnapshot.getChildren()) { 
       if (reco.getValue().toString().contains(mRecommendation.getGenre())) { 
        //below returns the items i want 
        Log.d("is this correct", reco.getValue().toString()); 
        //below returns everything in the original query 
        //how to populate only items that match the above? 
        myNewCollection.add(reco.getValue); 
       } 
      } 

      recyclerView.setAdapter(new MyRecyclerViewAdapter(myNewCollection, ...)); 
     } 

pls également jeter un oeil à Firebase docs et this SO question.
Il existe des méthodes intéressantes - startAt, endAt et equalTo, qui pourraient vous aider. Je n'ai pas trouvé la méthode contains, malheureusement, mais les méthodes ci-dessus pourraient vous suffire.

+0

Ouais je pense que je me rends compte que mAlbumQuery a besoin de changer ... J'essaie juste de comprendre ce qui devrait prendre sa place je suppose, ou peut-être que j'approche cela d'une manière différente. Je ne suis pas sûr. Où dois-je créer la nouvelle collection que vous mentionnez? – DarkKnightSDS

+0

Voir la mise à jour. –

+0

Merci, je vais travailler dessus aujourd'hui et vous faire savoir comment ça se passe. Contains n'existe pas sur les objets, c'est pourquoi je devais d'abord faire toString. Je suis à la recherche d'un mot clé spécifique dans une propriété de chaîne et essayant de retourner uniquement ceux qui ont le mot-clé. – DarkKnightSDS