0

Dans mon code, je récupère quelques keys stockés sous une référence puis en utilisant ces touches je récupère les données qui sont stockés sous ces keys dans la base de données.Impossible d'afficher tous les ensembles de données dans RecyclerView récupérés à partir de Firebase sous les touches qui sont récupérées avant

Voici mon code:

mDatabase.child("child").child(uid).addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

      if (dataSnapshot.getValue() != null) { 

       idOfGP = dataSnapshot.getValue().toString(); 

       mDatabase.child("anotherChild").child(idOfGP).addChildEventListener(new ChildEventListener() { 
        @Override 
        public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
         Map<String, String> mapData = (Map<String, String>) dataSnapshot.getValue(); 

         pNames.add(mapData.get("pName")); 

         pUrls.add(mapData.get("pUrl")); 

         mDatabase.child("yetAnotherChild").child(idOfGP).addListenerForSingleValueEvent(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           Map<String, String> mapData = (Map<String, String>) dataSnapshot.getValue(); 
           pS = mapData.get("s").trim(); 
           pV = mapData.get("v").trim(); 
           pW = mapData.get("w").trim(); 

           prepareData(); 

          } 

          @Override 
          public void onCancelled(DatabaseError databaseError) { 

          } 
         }); 


        } 
        ... 
        ... 

      } else { 
       Toast.makeText(getBaseContext(), "No data here", Toast.LENGTH_SHORT).show(); 
      } 

     } 
     ... 
     ... 
    }); 

est ici prepareData():

public void prepareData() { 
     rModelClass = new RModelClass(pS, pNames.get(pNames.size()-1), pUrls.get(pUrls.size()-1), pV, pW); 
     fastItemAdapter.add(0, rModelClass); 
     rRV.setAdapter(fastItemAdapter); 
     rRV.smoothScrollToPosition(0); 
    } 

est ici RModelClass.java:

public class RModelClass extends AbstractItem<RModelClass, RModelClass.ViewHolder> { 

    String pS, pWith, pV, pW, pUrl; 

    public RModelClass() {} 

    public RModelClass(String pS, String pWith, String pUrl, String pV, String pW) { 
     this.pS = pS.trim() + " with"; 
     this.pWith = pWith.trim(); 
     this.purl = pUrl; 
     this.pV = pV.trim(); 
     this.pW = pW.trim(); 
    } 

    @Override 
    public int getType() { 
     return R.id.recycler_view_r_p; 
    } 

    @Override 
    public int getLayoutRes() { 
     return R.layout.r_p_layout; 
    } 

    @Override 
    public void bindView(RModelClass.ViewHolder holder, List payloads) { 
     super.bindView(holder, payloads); 

     holder.pS.setText(pS); 
     holder.pWith.setText(pWith); 
     holder.pV.setText(pV); 
     holder.pW.setText(pW); 
     holder.pUrl.setText(pUrl); 

    } 

    protected static class ViewHolder extends RecyclerView.ViewHolder { 

     TextView pS, pWith, pV, pW, pUrl; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      pS = (TextView) itemView.findViewById(R.id.p_s); 
      pWith = (TextView) itemView.findViewById(R.id.p_with); 
      pV = (TextView) itemView.findViewById(R.id.p_v); 
      pW = (TextView) itemView.findViewById(R.id.p_w); 
      pUrl = (TextView) itemView.findViewById(R.id.p_url); 

     } 

    } 

} 

La référence: mDatabase.child("child").child(uid)... a trois différents keys y sont stockées, mais ce qui est passe est instea d de montrer 3 différents ensembles de données dans le recyclerview rRV, 3 mêmes ensembles de données sont affichés. Qu'est-ce que je fais de mal et que dois-je faire pour montrer 3 ensembles de données différents basés sur les 3 clés différentes récupérées de cette référence?

+0

Cela ressemble à un problème de portée. Vous définissez 'pS',' pV', et 'pW' pour les enregistrements récupérés, mais utilisez ensuite différentes variables dans prepareData() plutôt que de les transmettre. De plus, ce n'est pas une repro complète et minimale. Voir [Comment demander] (http://stackoverflow.com/help/how-to-ask) et [créer un mcve] (http://stackoverflow.com/help/mcve). – Kato

+0

@Kato quand j'ai utilisé différentes variables dans prepareData()? Ce sont toutes les variables récupérées dans le code ci-dessus. –

+0

Tout d'abord essayez de rendre 'idOfGP' local (non public) et voyez si cela résoudra votre problème. Si ce n'est pas le cas quand 'prepareData()' est appelé, 'pS',' pNames', 'pUrls' est déjà plein de valeur, le dernier enfant de' pNames' ne recevra qu'un seul élément spécifique (le dernier appelé) – koceeng

Répondre

0

Remplacement du code ci-dessus avec le code ci-dessous a fait le travail pour moi:

mDatabase.child("child").child(uid).addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

       if (dataSnapshot.getValue() != null) { 

        idOfGP = dataSnapshot.getValue().toString(); 
         mDatabase.child("anotherChild").child(idOfGP).addChildEventListener(new ChildEventListener() { 
          @Override 
          public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
           Map<String, String> mapData = (Map<String, String>) dataSnapshot.getValue(); 

           pNames = mapData.get("pName").trim(); 

           pUrls = mapData.get("pUrl"); 

          } 
          ... 
          ... 
         }); 

         mDatabase.child("yetAnotherChild").child(idOfGP).addListenerForSingleValueEvent(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           Map<String, String> mapData = (Map<String, String>) dataSnapshot.getValue(); 
           pS = mapData.get("s").trim(); 
           pV = mapData.get("v").trim(); 
           pW = mapData.get("w").trim(); 

           prepareData(); 

          } 

          @Override 
          public void onCancelled(DatabaseError databaseError) { 

          } 
         }); 

       } else { 
        Toast.makeText(getBaseContext(), "No recently played sport yet!", Toast.LENGTH_SHORT).show(); 
       } 

      } 
      ... 
      ... 
     }); 

est ici mis à jour prepareData():

public void prepareData() { 
     rModelClass = new RModelClass(pS, pNames, pUrls, pV, pW); 
     fastItemAdapter.add(0, rModelClass); 
     rRV.setAdapter(fastItemAdapter); 
     rRV.smoothScrollToPosition(0); 
    } 

RModelClass.java reste la même.