Обновление Firebase DB обновляет неправильные записи в дополнение к правильной записи - PullRequest
0 голосов
/ 05 сентября 2018

Я в недоумении, почему это происходит. У меня есть просмотрщик, перечисляющий набор объектов 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 иногда вызывается несколько раз. Но почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...