以上只是FirebaseDatabase中文件夹结构的一个例子。我的疑问是,我应该如何获取这些子节点的值。
下面是我试过的代码。
//FirebaseDatabase Collecting all the Item List
ValueEventListener listener= new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for (DataSnapshot ds: dataSnapshot.getChildren()){
arrayItemList.add(ds.getKey());
}
firebaseRecyclerViewItem(arrayItemList);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.i(TAG, "onCancelled: Unable to fetch data");
}
};
lookUpDatabase.addValueEventListener(listener);
这是方法firebaseRecyclerViewItem()的代码。
public void firebaseRecyclerViewItem(final ArrayList<String> arrayItemList) {
DatabaseReference reference = null;
String referenceName = null;
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//FirebaseDatabase 2'nd Reference Address
for (DataSnapshot ds : dataSnapshot.getChildren()) {
String key1 = ds.getKey();
Log.i(TAG, "onDataChange: " + key1);
String firebaseItemName = ds.child("DATA").getValue(String.class);
Log.i(TAG, "onDataChange: " + firebaseItemName);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
for (int i = 0; i < arrayItemList.size(); i++) {
referenceName = arrayItemList.get(i);
reference = FirebaseDatabase.getInstance().getReference().child("DATA").child(referenceName);
reference.addValueEventListener(valueEventListener);
//Loading RecyclerView
RecyclerViewItemList(reference, referenceName);
}
}
并不是说我不能得到这些值,我是可以得到的,但是在我所附的数据库图片中,有三个FILE01,FILE02和FILE03。我只能得到最后一个FILE03,"01 "的值,我的意思是ValueEventListner跳过所有其他FILE,只取最后更新或最后一个文件。但我希望所有的文件数据都能显示在我的recyclerView上。
我也尝试了不同的方法,我得到DataSnaphot,并使用for()Loop,在那里我使用嵌套循环。
//FirebaseDatabase Collecting all the Item List
ValueEventListener listener= new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
// here is where the changes which I have made, I tried to called the value which is impossible but still I tried to, but not result.
for (DataSnapshot ds: dataSnapshot.getChildren()){
String key= ds.getKey();
String firebaseItemName = ds.child("DATA").getValue(String.class);
Log.i(TAG, "onDataChange: " + firebaseItemName);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.i(TAG, "onCancelled: Unable to fetch data");
}
};
lookUpDatabase.addValueEventListener(listener);
RecyclerViewItemList(lookUpDatabase);
有什么方法可以让我调用这些值吗?
你应该调用"/FirebaseDatabase ... notifyDataSetChanged() 在 循环. 否则,你的 参考 和 参考名 将被重写。
所以你的代码应该是
for (int i = 0; i < arrayItemList.size(); i++){
//Add your data to arraylist
rvAdapter.notifyDataSetChanged();
}
编辑:
这将显示你的火库数据。我只是改变了你的第二种方法。
/*I changed Here*/
private ArrayList<HashMap<String,String>> yourChildList = new ArrayList<>();
ValueEventListener listener= new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
for (DataSnapshot ds: dataSnapshot.getChildren()){
/*I changed Here*/
HashMap<String,String> dataMap = new HashMap<>();
String key= ds.getKey();
String firebaseItemName = ds.child("DATA").getValue(String.class);
Log.i(TAG, "onDataChange: " + firebaseItemName);
/*I changed Here*/
dataMap.put(key,firebaseItemName);
yourChildList.add(yourDataMap);
}
/*I changed Here
*
*I think this method is used to update data to your recyclerView
*if I'm right, you can replace it
*RecyclerViewItemList(lookUpDatabase);
*
*/
yourRecyclerAdapter = new RecyclerAdapter(yourChildList);
yourRecyclerAdapter.notifyDataSetChanged();
recyclerView.setAdapter(yourRecyclerAdapter);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.i(TAG, "onCancelled: Unable to fetch data");
}
};
lookUpDatabase.addValueEventListener(listener);
注意我不建议你使用嵌套监听器。为了更好的性能和可维护性,你应该避免使用嵌套监听器。你应该使用 观察家 或 实时数据 以更新Recyclerview。