2016-12-13 10 views
0
を呼び出しません

私がしようとしているのは、FirebaseからユーザIDのリストを取得し、それらの各ユーザからデータを取得することです。私が抱えている問題は、IDのリストを喜んで検索することができますが、動作していないようです。このクエリのonDataChangeには決して到達しません。Firebase Android onDataChangeは

私は関係なく、私は何が今までlistOfItemsに追加されていないとあなたはまだonDataChangeに達することができない何のforループを除去しても、IDの値をハードコーディングすることにより、configurePage内のコードを修正しようとしたませんが、しています。 configurePageのログ行には正しいID数が表示されているため、2番目の開始時刻に終了しない最初のクエリを除外できます。

まずクエリ:

public void getIDs() { 
    spinner.setVisibility(View.VISIBLE); 
    search = mDatabase.child("linked_users").child(userID); 
    val = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d(TAG, "Test:" + dataSnapshot.getChildrenCount()); 
      for (DataSnapshot singleChild : dataSnapshot.getChildren()) { 
       listOfIDs.add(singleChild.getKey()); 
      } 
      if (listOfIDs.size() == 0) { 
       spinner.setVisibility(View.GONE); 
       noResultsLabel.setVisibility(View.VISIBLE); 
       countLabel.setVisibility(View.GONE); 
      } else { 
       countLabel.setText("Total users: " + listOfIDs.size()); 
       countLabel.setVisibility(View.VISIBLE); 
       configurePage(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.d(TAG, "DB problem"); 
      AlertDialog.Builder dialog = new AlertDialog.Builder(AgentViewUsers.this); 
      dialog = databaseDialog(dialog); 
      dialog.show(); 
     } 
    }; 
    search.addListenerForSingleValueEvent(val); 
} 

2番目のクエリ:あなたが期待される振る舞いを見ている何

public void configurePage() { 
    Log.d(TAG, "test = " + listOfIDs.size()); 
    for (String id : listOfIDs){ 
     mDatabase.child("users").child(id).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       AgentUserViewObject obj = new AgentUserViewObject(); 
       obj.name = dataSnapshot.child("full_name").getValue().toString(); 
       obj.address = dataSnapshot.child("address").getValue().toString() + ", " + dataSnapshot.child("towncounty").getValue().toString() + ", " + dataSnapshot.child("postcode").getValue().toString(); 
       obj.requestCount = Integer.parseInt(dataSnapshot.child("requests_submitted").getValue().toString()); 
       listOfItems.add(obj); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 
    mLayoutManager = new LinearLayoutManager(AgentViewUsers.this); 
    mAdapter = new AgentUserViewAdapter(listOfItems); 
    mRecyclerView.addItemDecoration(new DividerItemDecoration(AgentViewUsers.this,DividerItemDecoration.VERTICAL_LIST)); 
    mRecyclerView.setLayoutManager(mLayoutManager); 
    mRecyclerView.setAdapter(mAdapter); 
    spinner.setVisibility(View.GONE); 
} 
+0

):、あなたがadapter.notifyDataSetChanged()を呼び出すことができることをすることができません。 –

+0

ログを追加しました - onCancelled呼び出しもonDataChange呼び出しもありません。 – markeh21

+0

私は訂正しました。さらに調査すると、onDataChangeが呼び出され、データが取得されていますが、forループの終了時に取得されないため、リサイクラビューが設定されているときはまだ空です。 – markeh21

答えて

2

。 Firebase(最新のクラウドAPIなど)は、サーバからのデータを非同期にロードして更新します。したがって、addListenerForSingleValueEventと呼ぶと、はデータを同期するを開始します。しかし、それは後で(潜在的に多くの)後でそれで終わることはありません。

そのため、Firebaseを扱う際には、異なる考え方をする必要があります。 「最初にデータを取得し、そのデータでリストビューを更新する」というコードをコーディングするのではなく、「データを取得するたびに、そのデータでリストビューを更新する」というコードを再構築します。

この再構成されたアプローチでは、onDataChange()メソッド内からリストビューを更新する必要があります。セキュリティルールは、読み取りが失敗する原因となっているかどうかを確認するために2番目のクエリの `(onCancelled`に `Log`文を追加し

Log.d(TAG, "test = " + listOfIDs.size()); 
for (String id : listOfIDs){ 
    mDatabase.child("users").child(id).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      AgentUserViewObject obj = new AgentUserViewObject(); 
      obj.name = dataSnapshot.child("full_name").getValue().toString(); 
      obj.address = dataSnapshot.child("address").getValue().toString() + ", " + dataSnapshot.child("towncounty").getValue().toString() + ", " + dataSnapshot.child("postcode").getValue().toString(); 
      obj.requestCount = Integer.parseInt(dataSnapshot.child("requests_submitted").getValue().toString()); 
      listOfItems.add(obj); 
      mAdapter.notifyDataSetChanged(); // tell the adapter to redraw the view 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 
mLayoutManager = new LinearLayoutManager(AgentViewUsers.this); 
mAdapter = new AgentUserViewAdapter(listOfItems); 
mRecyclerView.addItemDecoration(new DividerItemDecoration(AgentViewUsers.this,DividerItemDecoration.VERTICAL_LIST)); 
mRecyclerView.setLayoutManager(mLayoutManager); 
mRecyclerView.setAdapter(mAdapter); 
spinner.setVisibility(View.GONE); 
関連する問題