J'essaie de développer une application de magasinage simple. Il y aura quelques catégories de produits et j'utilise une activité différente avec ListView pour chaque catégorie. Lorsque l'utilisateur choisit une catégorie de produit (par exemple items1 = "drinks") - un nouvel écran s'ouvre et il peut ajouter "soda", "cola" ... Je souhaite ajouter un badge de comptage sur chaque catégorie pour indiquer le nombre de produits par catégorie ..__ Donc, par exemple pour "items", je dois afficher 5, pour "items1" - 2 et pour "items10/11" - display 1:
mon code 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() + "");
}
Après avoir exécuté le code, j'ai reçu la clé et le nombre de ses enfants: E-KJGG2driQ6HJI8R7eve: 1 E-KJGG3Ua6rmlQYn4IHF: 1
c'est toujours 1 enfant pour chaque clé car clé = ID du produit et enfant de la clé - c'est le titre. Mais je dois compter les identifiants Keys/Product (produits de la catégorie "boissons") et non ses enfants ...
Avec cette base de données, vous avez deux options:
1) Utiliser l'enfant ajouté
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) Utiliser le listener 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) {
}
});
Voici la sortie pour les deux cas
Si vous devez garder un suivi constant, il est préférable d'utiliser les événements Child ... car sinon, chaque fois que quelque chose change, vous recevez l'intégralité du JSON sur le réseau, au lieu de la partie des informations qui ont été modifiées
Si vous avez besoin d'un instantané une seule fois, vous feriez mieux d'utiliser singleValue, car vous recevrez ainsi toutes les informations en même temps.
Je ne suis pas sûr de cela, mais cela peut évoquer une analyse syntaxique. Essayez de
badgeView.setText(nums+"");
peut-être que cela pourrait aider.