有没有一种有效的方法可以将Firebase数据存储在数组列表中,然后读取它



我试图将firebase数据存储在arraylist中,然后使用它,但当我尝试读取arraylist时,它显示为null或只有2个数据。使用日志,我意识到childEventListener正在逐个存储数据,当我读取arraylist时,它并没有包含所有数据。因此,我需要首先存储所有数据,当childEventListener完成读取arraylist时。

我需要帮助找到最有效的方法。

这是我的代码:(我在onCreate中编写了这个代码片段(。

ArrayList<Data> listData = new ArrayList<>();
/**onCreate**/
childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

if (dataSnapshot.getChildrenCount() > 0) {
Data data = dataSnapshot.getValue(Data.class);
listData.add(data);
buildRecycler();
} else {
Toast.makeText(getApplicationContext(), getString(R.string.AunNoHayDatos), Toast.LENGTH_LONG).show();
}


}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
mDbRef.addChildEventListener(childEventListener);
/**onCreate**/
/*out of onCreate*/
public void buildRecycler(){


for(int i=0; i< listData.size(); i++){
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
Date date = null;
try {
date = df.parse(listData.get(i).getFecha());
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
if(date != null){
cal.setTime(date);
}
cal.setFirstDayOfWeek(Calendar.SUNDAY);
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
String[] days = new String[7];
for (int j = 0; j < 7; j++)
{
days[j] = df.format(cal.getTime());
cal.add(Calendar.DAY_OF_MONTH, 1);
}
listWeeks.add(days[0]);

}

}

在这种情况下,使用这样的ValueEventListener更容易:

valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
listData.clear();
for (DataSnapshot childSnapshot dataSnapshot.getChildren()) {
Data data = childSnapshot.getValue(Data.class);
listData.add(data);
}
buildRecycler();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
};
mDbRef.addValueEventListener(valueEventListener);

因此,现在所有数据都在单个dataSnapshot中传递,我们在其getChildren()上循环以获得单个Data对象。

您会注意到,我添加了一个listData.clear(),因为每次调用onDataChange时都会带有所有子级的快照,而不仅仅是更改的子级。

最新更新