我尝试开发一个简单的购物应用程序。将有一些产品类别,我对每个类别使用ListView的不同活动。当用户选择产品类别(比如items1 =“drink”)时 - 新的屏幕打开,他可以添加“soda”,“cola”......我想在每个类别上添加计数徽章,以显示每个类别的产品数量。 所以,例如对于“items”我需要显示5,对于“items1” - 2和对于“items10 / 11” - 显示1:
我的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(“饮料”类别中的产品)而不是他的孩子 ......
答案 0 :(得分:26)
使用此数据库,您有两个选择:
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) {
}
});
以下是两种情况的输出
如果您需要保持持续跟踪最好使用子事件...因为否则每次任何更改都会通过网络收到整个json,而不是只有部分信息被更改
如果您只需要一次快照,最好使用singleValue,因为这样您将同时收到所有信息
答案 1 :(得分:0)
我不确定,但它可以解析。尝试
badgeView.setText(nums+"");
也许它会有所帮助。