Я в недоумении, почему это происходит. У меня есть просмотрщик, перечисляющий набор объектов Hour в виде флажков с текстом.
Не удалось найти способ вставки видео. Клип на YouTube здесь: https://www.youtube.com/watch?v=KI9FJSfmrXM
Фильм показывает вид моей базы данных Firebase RealTime слева. Каждый элемент соответствует флажку в моем приложении справа. Ключи - часы каждого предмета в военное время. Таким образом, 8 утра - 8, а 5 вечера - 17, и т. Д. Когда я проверяю / снимаю отметку с элемента, другие предметы также выбираются случайным образом. Я обновляю весь объект за этот час:
public static class ProtocolRecyclerViewAdapter extends FirebaseRecyclerAdapter<Hour, ProtocolRecyclerViewAdapter.HourHolder> {
private final DailyScheduleActivity mParentActivity;
private DatabaseReference mDb;
private String protocolUserDateKey;
ProtocolNonMalignant mProtocol = new ProtocolNonMalignant();
ProtocolRecyclerViewAdapter(DailyScheduleActivity parent, DatabaseReference db, String protocolKey, FirebaseRecyclerOptions<Hour> options) {
super(options);
mParentActivity = parent;
mDb = db;
protocolUserDateKey = protocolKey;
}
@NonNull
@Override
public HourHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_protocol_row, parent, false);
return new HourHolder(view);
}
@Override
public void onBindViewHolder(@NonNull HourHolder holder, final int position, final Hour currentHour) {
holder.mHourCheckBox.setText(currentHour.toString());
String state = determineCheckboxState(currentHour);
if (state.equals("unchecked")) {
holder.mHourCheckBox.setChecked(false);
} else if (state.equals("checked")) {
holder.mHourCheckBox.setChecked(true);
}
//https://stackoverflow.com/questions/25646048/how-to-convert-local-time-to-am-pm-time-format-using-jodatime
LocalTime time = new LocalTime(currentHour.getMilitaryHour(), 0);
DateTimeFormatter fmt = DateTimeFormat.forPattern("h:mm a");
holder.mHour.setText(fmt.print(time));
holder.mHourCheckBox.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton cb, boolean isChecked) {
cb = (CheckBox) cb;
if (cb.isChecked()) {
currentHour.setState(true);
mDb.child(protocolUserDateKey).child(String.valueOf(currentHour.getMilitaryHour())).setValue(currentHour);
} else {
currentHour.setState(false);
mDb.child(protocolUserDateKey).child(String.valueOf(currentHour.getMilitaryHour())).setValue(currentHour);
}
}
});
}
class HourHolder extends RecyclerView.ViewHolder {
final CheckBox mHourCheckBox;
final ImageView mOpenTasks;
final TextView mHour;
HourHolder(View view) {
super(view);
mHourCheckBox = (CheckBox) view.findViewById(R.id.cb_hour_all);
mOpenTasks = (ImageView) view.findViewById(R.id.open_tasks);
mHour = (TextView) view.findViewById(R.id.hour);
}
}
private String determineCheckboxState(Hour hour) {
boolean allFalse = true;
boolean allTrue = true;
// Check the state of Juice, Meal, and CE.
if (hour.getJuice() != null && hour.getJuice().getState() == true ||
hour.getMeal() != null && hour.getMeal().getState() == true ||
hour.getCe() != null && hour.getCe().getState() == true) {
allFalse = false;
} else {
allTrue = false;
}
// Check the state of the supplements.
ArrayList<Supplement> supplements = hour.getSupplements();
for (int i = 0; i < supplements.size(); i++) {
if (supplements.get(i).getState() == true) {
allFalse = false;
} else {
allTrue = false;
}
}
if (allFalse == true) {
return "unchecked";
} else if (allTrue == true) {
return "checked";
}
}
}
Часть ".child (String.valueOf (currentHour.getMilitaryHour ()))" должна ограничивать обновление только соответствующим часом, не так ли? Когда я работаю с отладчиком, «currentHour» всегда является правильной информацией.
Обновление:
Этот код обновления базы данных находится внутри onBindViewHolder Recyclerview FirebaseRecyclerAdapter. А помещение Log.d внутрь onBindViewHolder регистрирует сообщение несколько раз, когда происходит случайное обновление. Это означает, что onBindViewHolder иногда вызывается несколько раз. Но почему?