2017-09-17 2 views
0

Ich habe ein Problem hier. Ich habe ein Firebase-Datenbank-Kind namens "Benutzer", darin habe ich ein anderes Kind namens "Teams", und ich muss den Inhalt in "Teams" nehmen und sie in einem ListView mit FirebaseAdapter zeigen.Nehmen Sie Firebase Data Listeners im richtigen Moment

Die FirebaseAdapter ist wie folgt:

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") 


    ) 

Wie Sie sehen können, ich nehme will die „Teams“ innerhalb eines specifc Kind, dass ich die „idUser“ Suche. Dieser "idUser" wird mithilfe eines Datensnapshot aus der Firebase erstellt, wo ich nach der ID des Benutzers suche, der in der App angemeldet ist. Der datasnapshot Code ist unten:

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

     } 
    }); 

Mein Problem hier ist, die „idUser“ aufgerufen wird im Codeteil des FirebaseListAdapter vor der Abfrage ausgeführt erhalten wird. So bekomme ich einen Fehler, weil der idUser leer ist. Wie kann ich dieses Problem lösen?

Antwort

0

Ich löste dieses Problem, indem ich nur den Code des Firebase-Adapters innerhalb des Hörers bewegte.

0

Um dieses Problem zu lösen, verschieben Sie die Deklaration idUser String in der onDataChange() -Methode, andernfalls wird es immer null.

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

Dies wird durch das asynchrone Verhalten von onDataChange() Methode geschieht, die, bevor Sie selbst .child(idUser) zu Ihrem DatabaseReference zuweisen aufgerufen wird.

Verschieben Sie die Deklaration innerhalb der Methode und using it auch dort, löst Ihr Problem. Verwenden Sie auch eine Log-Anweisung innerhalb der Methode wie folgt aus:

Log("TAG", idUser); 

Wenn Sie den Wert dieser String außerhalb dieses Verfahren verwenden möchten, nehmen Sie bitte einen Blick auf meine Antwort von diesem Posten, How To Get Async Value Outside onDataChange() Method.

Ich hoffe, es hilft.