Firebase Android计数儿童/徽章

时间:2016-06-02 19:21:08

标签: android count firebase firebase-realtime-database

我尝试开发一个简单的购物应用程序。将有一些产品类别,我对每个类别使用ListView的不同活动。当用户选择产品类别(比如items1 =“drink”)时 - 新的屏幕打开,他可以添加“soda”,“cola”......我想在每个类别上添加计数徽章,以显示每个类别的产品数量。 所以,例如对于“items”我需要显示5,对于“items1” - 2和对于“items10 / 11” - 显示1:

enter image description here

我的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() + "");
                }

运行代码后,我收到了Key及其子女的数量: E-KJGG2driQ6HJI8R7eve:1 E-KJGG3Ua6rmlQYn4IHF:1

每个Key总是1个孩子,因为Key =产品ID和Key的子项 - 它的标题。 但我需要计算键/产品ID(“饮料”类别中的产品)而不是他的孩子 ......

2 个答案:

答案 0 :(得分:26)

Databse Reference

使用此数据库,您有两个选择:

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)使用值监听器

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) {

    }
});

以下是两种情况的输出

enter image description here

如果您需要保持持续跟踪最好使用子事件...因为否则每次任何更改都会通过网络收到整个json,而不是只有部分信息被更改

如果您只需要一次快照,最好使用singleValue,因为这样您将同时收到所有信息

答案 1 :(得分:0)

我不确定,但它可以解析。尝试

badgeView.setText(nums+"");

也许它会有所帮助。