我试图将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
时都会带有所有子级的快照,而不仅仅是更改的子级。