2017-09-17 10 views
0

ここに問題があります。 私はFirebase Databaseの子を "users"と呼んでいます。その中に "teams"という名前の他の子があります。そして、 "teams"内のコンテンツをFirebaseAdapterでListViewに表示する必要があります。適切なタイミングでFirebase Data Listenerを使用してください

FirebaseAdapterはこのようなものです:あなたが見ることができるように

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


    ) 

、私は「idUser」を使用して検索すること、specifc子内部の「チーム」を取るたいです。 この「idUser」は、firebaseのdatasnapshotを使って取得されます。ここで、私はアプリにログオンしているユーザーのIDを検索します。 datasnapshotコードは以下の通りです:ここ

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

     } 
    }); 

私の問題は、クエリが実行され得る前に、「idUserは」FirebaseListAdapterのコード部分に呼ばれている、です。 idUserが空であるため、エラーが発生します。私はこのような問題をどうやって解決できますか?

答えて

0

firebaseadapterのコードをリスナーの内側に移動するだけでこの問題を解決しました。

0

この問題を解決するには、idUser Stringの宣言をonDataChange()メソッド内に移動します。そうでない場合は、常にnullになります。

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

これも、あなたはあなたのDatabaseReference.child(idUser)を割り当てる前に呼び出されonDataChange()方法、の非同期動作により起こっています。

メソッド内で宣言を移動し、using itもそこに移動すると、問題が解決します。また、このような方法で内部のログステートメントを使用します。

Log("TAG", idUser); 

あなたはその方法の外にその文字列の値を使用したい場合は、この記事からの私の答えを見てHow To Get Async Value Outside onDataChange() Methodしてください。

希望します。

関連する問題