シンプルなショッピングアプリを開発してみます。いくつかの製品カテゴリがあり、すべてのカテゴリに対してListViewで異なるアクティビティを使用します。ユーザーが商品カテゴリを選択すると(items1 = "drinks"など)、新しい画面が開き、「soda」、「cola」を追加できます...各カテゴリにカウントバッジを追加して、カテゴリごとの製品数を表示します。したがって、たとえば「items」の場合、「items1-2」および「items10/11」-ディスプレイ1の場合は5を表示する必要があります。
私のActivityItems1コード:
private Firebase mRef;
private String mUserId;
private String itemsUrl;
private TextView badge;
itemsUrl = Constants.FIREBASE_URL + "/users/" + mUserId + "/items1";
// Set up LisView
final ListView listView = (ListView) findViewById(R.id.listView);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, Android.R.layout.simple_list_item_1, Android.R.id.text1);
listView.setAdapter(adapter);
// Find badge
badge =(TextView)findViewById(R.id.badgeView);
// Use Firebase to populate the list.
new Firebase(itemsUrl)
.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
adapter.add((String) dataSnapshot.child("title").getValue());
Log.e(dataSnapshot.getKey(), dataSnapshot.getChildrenCount() + "");
badge.setText(dataSnapshot.getChildrenCount() + "");
}
コードを実行した後、キーと彼の子供の数を受け取りました:E-KJGG2driQ6HJI8R7eve:1 E-KJGG3Ua6rmlQYn4IHF:1
key = Product IDとKeyの子であるため、すべてのKeyに対して常に1つの子です-タイトルです。 しかし、彼の子供ではなく、キー/製品ID(「ドリンク」カテゴリの製品)を数える必要があります...
このデータベースには2つのオプションがあります。
1)追加された子を使用
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference();
//You must remember to remove the listener when you finish using it, also to keep track of changes you can use the ChildChange
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Log.e(dataSnapshot.getKey(),dataSnapshot.getChildrenCount() + "");
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
2)Valueリスナーを使用する
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference();
//You can use the single or the value.. depending if you want to keep track
thismyRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snap: dataSnapshot.getChildren()) {
Log.e(snap.getKey(),snap.getChildrenCount() + "");
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
これは両方の場合の出力です
一定の追跡を維持する必要がある場合は、Childイベントを使用するのが最適です。それ以外の場合は、何かが変更されるたびに、変更された情報の一部だけではなく、json全体がネットワーク経由で受信されます。
スナップショットが1回だけ必要な場合は、singleValueを使用することをお勧めします。これにより、すべての情報を同時に受け取ることができます。
それについてはよくわかりませんが、解析の原因になる可能性があります。してみてください
badgeView.setText(nums+"");
多分それは助けることができます。