FirebaseRecyclerAdapter не отображает изменения от notifyDataSetChanged () - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть FirebaseRecyclerAdapter, отображающий список объектов с их состояниями.

enter image description here

Я нажимаю на стрелку справа и открываю фрагмент AlertDialog, где я могу изменить состояние каждого элемента (отметить / снять флажок с элемента).

enter image description here

Результаты из фрагмента AlertDialog отправляются обратно в операцию, которая содержит представление recycler, путем реализации интерфейса из DialogFragment:

@Override
public void onDialogPositiveClick(Bundle bundle) {

    Hour hour = bundle.getParcelable("hour");

    mDatabase.child(protocolKey).child(String.valueOf(hour.getMilitaryHour())).setValue(hour);
    mProtocolAdapter.notifyDataSetChanged();
}

Данные, возвращаемые из фрагмента диалога, верны - часовой объект в onDialogPositiveClick показывает правильные данные с обновлениями, которые были сделаны в диалограмме. И ДАННЫЕ ПРАВИЛЬНО ОБНОВЛЯЮТСЯ В БАЗЕ ДАННЫХ. Однако notifyDataSetChanged неправильно обновляет список со своими состояниями.

У меня была похожая проблема в другой части проекта (в настоящее время она разделена, чтобы изолировать вещи от текущей проблемы), и она оказалась вызвана сочетанием использования слушателя и повторного использования представлений. Я предполагаю, что это похожий случай, но это исправление (установка слушателя на ноль в первую очередь) здесь не работает.

Активность с Recyclerview:

public class DailyScheduleActivity2 extends AppCompatActivity implements HourlyTaskDialogFragment.HourlyTaskDialogListener  {

    private DatabaseReference mDatabase;
    private RecyclerView mProtocolRv;
    private String protocolKey;
    private ProtocolRecyclerViewAdapter mProtocolAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daily_schedule);

        protocolKey = "daily/" + FirebaseAuth.getInstance().getCurrentUser().getUid() + "_" + new LocalDate();

        mDatabase = FirebaseDatabase.getInstance().getReference();

        Query query = mDatabase.child(protocolKey);

        FirebaseRecyclerOptions<Hour> options =
                new FirebaseRecyclerOptions.Builder<Hour>()
                        .setQuery(query, Hour.class)
                        .build();


        mProtocolRv = findViewById(R.id.rv_protocol);
        mProtocolRv.setHasFixedSize(false);
        LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
        mProtocolRv.setLayoutManager(mLayoutManager);
        mProtocolAdapter = new ProtocolRecyclerViewAdapter(this, mDatabase, protocolKey, options);
        mProtocolRv.setAdapter(mProtocolAdapter);
    }

    public static class ProtocolRecyclerViewAdapter extends FirebaseRecyclerAdapter<Hour, ProtocolRecyclerViewAdapter.HourHolder> {

        private final DailyScheduleActivity2 mParentActivity;

        ProtocolRecyclerViewAdapter(DailyScheduleActivity2 parent, DatabaseReference db, String protocolKey, FirebaseRecyclerOptions<Hour> options) {
            super(options);
            mParentActivity = parent;
        }

        @NonNull
        @Override
        public HourHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_protocol_row2, parent, false);
            return new HourHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull HourHolder holder, int position, final Hour currentHour) {

            holder.mHourCheckBox.setText(currentHour.toString());

            //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.mOpenTasks.setOnClickListener(null);
            holder.mOpenTasks.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    DialogFragment hourlyTasksFragment = new HourlyTaskDialogFragment().newInstance(currentHour);
                    hourlyTasksFragment.show(mParentActivity.getSupportFragmentManager(), "HourlyTasks");
                }
            });
        }

        class HourHolder extends RecyclerView.ViewHolder {

            final TextView mHourCheckBox;
            final ImageView mOpenTasks;
            final TextView mHour;

            HourHolder(View view) {
                super(view);
                mHourCheckBox = (TextView) view.findViewById(R.id.cb_hour_all);
                mOpenTasks = (ImageView) view.findViewById(R.id.open_tasks);
                mHour = (TextView) view.findViewById(R.id.hour);
            }
        }
    }

    @Override
    public void onDialogPositiveClick(Bundle bundle) {

        Hour hour = bundle.getParcelable("hour");

        mDatabase.child(protocolKey).child(String.valueOf(hour.getMilitaryHour())).setValue(hour);
        mProtocolAdapter.notifyDataSetChanged();
    }

    @Override
    protected void onStart() {
        super.onStart();
        mProtocolAdapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        mProtocolAdapter.stopListening();
    }
}
...