因此,我尝试使用基于我的firebase数据库上的某些信息的颜色初始化每个日历单元格,并且为此我使用设置为false的标志,然后如果条件满足则变为true。问题是addListenerForSingleValueEvent是一个异步方法,因此该标志一直返回false。我应该怎么处理?
mCalendar.addDecorator(new DayViewDecorator() {
@Override
public boolean shouldDecorate(final CalendarDay day) {
final boolean[] flag = {false};
final String currentDate = day.getCalendar().get(Calendar.YEAR)
+ "" + day.getCalendar().get(Calendar.MONTH)
+ "" + day.getCalendar().get(Calendar.DAY_OF_MONTH);
database.child(currentDate).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
flag[0] = true;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return flag[0];
}
@Override
public void decorate(DayViewFacade view) {
view.addSpan(new ForegroundColorSpan(
ContextCompat.getColor(getApplicationContext(), R.color.material_red_a200)));
}
});
答案 0 :(得分:1)
要解决此问题,请在boolean[] flag
方法中移动onDataChange()
数组的声明,否则它将始终为null。
public void onDataChange(DataSnapshot snapshot) {
final boolean[] flag = {false};
if (snapshot.exists()) {
flag[0] = true;
}
Log.d("TAG", flag[0]);
}
这是由于onDataChange()
方法的异步行为而发生的,即使您尝试从该数组中获取值,也会调用此方法。
在方法中移动声明并在那里使用它,解决了你的问题。
如果您想在该方法之外使用该数组的值,请查看我在这篇文章中的回答How To Get Async Value Outside onDataChange() Method。