2017-09-17 1 views
0

Je vais avoir un problème ici. Je un enfant Firebase de base de données appelée « utilisateurs », à l'intérieur, j'ai d'autres enfants appelé « équipes », et je dois prendre le contenu à l'intérieur des « équipes » et leur montrer dans un ListView avec FirebaseAdapter.Prendre Firebase données Listeners au bon moment

Le FirebaseAdapter est comme ceci:

FirebaseListAdapter<String> firebaseListAdapter = new FirebaseListAdapter<String>(
      this, 
      String.class, 
      android.R.layout.simple_list_item_1, 
      //todo Conseguir exibir na lista, as equipes embedadas no usuário logado 
      mRef.child("users").child(idUser).child("teams") 


    ) 

Comme vous pouvez le voir, je veux prendre les « équipes » à l'intérieur d'un enfant specifc, que je recherche en utilisant les « idUser ». Ce « idUser » est prise en utilisant un datasnapshot du firebase, où je recherche l'ID de l'utilisateur connecté sur l'application. Le code datasnapshot est ci-dessous:

user = mAuth.getCurrentUser().getEmail().toString(); 
    mRef = FirebaseDatabase.getInstance().getReference(); 
    Query query = mRef.child("usuarios").orderByChild("email").equalTo(user); 
    query.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot child : dataSnapshot.getChildren()){ 
       idUser = child.getKey().toString(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Mon problème ici est le « idUser » est appelé dans la partie du code de la FirebaseListAdapter avant que la requête en cours d'exécution se. J'ai donc une erreur, car l'idUser est vide. Comment puis-je résoudre ce problème?

Répondre

0

Je résolu ce problème vient de déplacer le code de la firebaseadapter à l'intérieur de l'auditeur.

0

Pour résoudre ce problème, déplacez la déclaration de idUser String à l'intérieur de la méthode onDataChange(), sinon ce sera toujours null.

String idUser = child.getKey().toString(); 

Ceci se produit en raison du comportement asynchrone de la méthode onDataChange(), qui est appelée avant même que vous attribuez à votre .child(idUser)DatabaseReference.

Déplacement de la déclaration dans la méthode et using it là aussi, permet de résoudre votre problème. Utilisez également une déclaration de journal dans la méthode comme ceci:

Log("TAG", idUser); 

Si vous souhaitez utiliser la valeur de cette chaîne en dehors de cette méthode, s'il vous plaît jeter un oeil à ma réponse de ce poste, How To Get Async Value Outside onDataChange() Method.

Espérons que ça aide.