web-dev-qa-db-ja.com

Firebase Android子供を数える/バッジ

シンプルなショッピングアプリを開発してみます。いくつかの製品カテゴリがあり、すべてのカテゴリに対してListViewで異なるアクティビティを使用します。ユーザーが商品カテゴリを選択すると(items1 = "drinks"など)、新しい画面が開き、「soda」、「cola」を追加できます...各カテゴリにカウントバッジを追加して、カテゴリごとの製品数を表示します。したがって、たとえば「items」の場合、「items1-2」および「items10/11」-ディスプレイ1の場合は5を表示する必要があります。

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

コードを実行した後、キーと彼の子供の数を受け取りました:E-KJGG2driQ6HJI8R7eve:1 E-KJGG3Ua6rmlQYn4IHF:1

key = Product IDとKeyの子であるため、すべてのKeyに対して常に1つの子です-タイトルです。 しかし、彼の子供ではなく、キー/製品ID(「ドリンク」カテゴリの製品)を数える必要があります...

8
user5866501

Databse Reference

このデータベースには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) {

    }
});

これは両方の場合の出力です

enter image description here

一定の追跡を維持する必要がある場合は、Childイベントを使用するのが最適です。それ以外の場合は、何かが変更されるたびに、変更された情報の一部だけではなく、json全体がネットワーク経由で受信されます。

スナップショットが1回だけ必要な場合は、singleValueを使用することをお勧めします。これにより、すべての情報を同時に受け取ることができます。

26
Ymmanuel

それについてはよくわかりませんが、解析の原因になる可能性があります。してみてください

badgeView.setText(nums+"");

多分それは助けることができます。

0
Rıdvan