現在、私はFirebaseデータベースを使用しているAndroid Appをビルドしています。Android - Firebase - getChildrenCount()メソッドの問題
私のコードでは、Firebaseデータベースの特定のパスにある子供の数を取得しようとしています。 Firebase固有のパスの参照を定義したら、DataSnapshotを取得してgetChildrenCount()を呼び出すためにリスナーを作成しました。
その後、この結果をFOR-Loopで使用したいと考えています。ただし、コードは機能しません。
Log.v("NUM_OF_PRODUCTS",numOfProducts+"")
が0の場合、FOR-Loopが実行され、リスナーが実行されているように見えますが、コードではリスナーコードが最初に来て、次にループコードが続きます。私のコードの
パート:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product_selection);
selected_cat = getIntent().getExtras().getString("pass_selected_cat");
listView = (ListView) findViewById(R.id.listView);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arrayList);
listView.setAdapter(adapter);
fbdatabase = FirebaseDatabase.getInstance();
fbref_products = fbdatabase.getReference("PRODUCTS/SM_0/" + selected_cat);
//Listener for getting numOfProducts.
fbref_products.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
numOfProducts = (int) dataSnapshot.getChildrenCount();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//Print numOfProducts before FOR-Loop being executed.
Log.v("NUM_OF_PRODUCTS",numOfProducts+"");
//FOR-Loop
for (int i = 0; i < numOfProducts; i++) {
String str = i + "";
DatabaseReference product_ref = fbref_products.child(str);
product_ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
String productName = (String) map.get("productName");
arrayList.add(productName);
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
//textView.setText("The read failed: " + databaseError.getMessage());
}
});
}
変数numOfProducts
代わりに、我々は特定の番号を持っていたならば私のコードは正常に動作します。
誰でも私を助けることができますか?