我在弄清楚如何获取Firebase实时数据库中项目/子项数以供我的应用用作 int 值时遇到麻烦。
检查下面的图像:
因此,如您在上面看到的,我有2个孩子 images_list 。
我要做的是:将 images_list 的项/子项数返回到我的应用中,最初显然等于2,然后将该数字扩展每当我添加更多项目/孩子时。
所以我的问题是,我要实现什么代码来捕获该数据库中的子代数量?然后如何将这个数字转换为int值?我已经尝试了不同的方法,但是到目前为止,还没有找到解决方案。
我希望这是有道理的。非常感谢您的协助!
界面
public interface FirebaseCallback {
void onCallback(List<String> list);
}
readData方法
private void readData(final FirebaseCallback firebaseCallback) {
mDatabaseImagesRef = FirebaseDatabase.getInstance().getReference("images_list");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String imageItems = ds.getValue(String.class);
imageList.add(imageItems);
}
firebaseCallback.onCallback(imageList);
Log.i("imageList.size() is: ", String.valueOf(imageList.size()));
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.i(LOG_TAG, databaseError.getMessage());
}
};
mDatabaseImagesRef.addListenerForSingleValueEvent(valueEventListener);
}
在onCreate()
中被叫
readData(new FirebaseCallback() {
@Override
public void onCallback(List<String> list) {
mImageAdapter.notifyDataSetChanged();
}
});
RecyclerViewAdapter中的getItemCount()
@Override
public int getItemCount() {
return imagesList.size();
}
答案 0 :(得分:1)
要计算images_list
节点下的所有子代,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference imagesListRef = rootRef.child("images_list");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int count = (int) dataSnapshot.getChildrenCount(); //Cast long to int
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
imagesListRef.addListenerForSingleValueEvent(valueEventListener);
然后如何将这个数字转换为int值?
根据官方文档,getChildrenCount()方法返回long
,而不是返回int
。因此,您需要将该原语转换为整数。
如何从此代码块中提取计数,以便它也可以在此代码之外引用和使用?
您不能简单地将count
变量创建为全局变量并在onDataChange()
方法之外使用它,因为由于该方法的异步行为,它将始终为0
。这意味着,如果尝试在此方法之外使用其结果,则数据尚未完成从数据库的加载,因此无法访问。换句话说,您的count
将始终为0。
对此问题的快速解决方案是仅在count
方法内使用onDataChange()
变量的值,否则我建议您从此 { {3}} ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。
答案 1 :(得分:0)
尝试
userReference = FirebaseDatabase.getInstance().getReference("images_list");
userReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
num = dataSnapshot.getChildrenCount();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 2 :(得分:0)
mRef= FirebaseDatabase.getInstance().getReference("images_list");
在侦听器内的“ onDataChange”方法上,使用getChildrenCount()获取图像数量,您可以使用i循环(例举:)来迭代那些子代:
mRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int count = dataSnapshot.getChildrenCount();
// here you get your images number
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String key = ds.getKey()
// and here you get the key
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 3 :(得分:0)
尝试以下代码:
public void onDataChange(@NonNull DataSnapshot snap) {
int count = (int) snap.getChildrenCount();
//shows the number of items
}