web-dev-qa-db-fra.com

Firebase Android count enfants/badge

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:

 enter image description here

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 ...

5
user5866501

 Databse Reference

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

 enter image description here

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.

25
Ymmanuel

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.

0
Rıdvan