Не обновляется adapter в фрагменте

Почему-то не сразу обновляется adapter. В фрагменте, в onStart я использую самописный метод checkActiveTasks(находится в классе TaskTimeChecker). Он сравнивает дату окончания задачи с сегодняшней датой и если дата окончания больше сегодняшней, то он перекидывает это задачу в другой фрагмент(удаляет из таблицы БД одного фрагмента и добавляет в таблицу другого). Проблема в том, что не сразу пропадает удаленная задача(пример в видео).

Видео, демонстрация проблемы: ТЫК или https://www.youtube.com/watch?v=94Fm8mOfeX0

Пояснение к видео. Когда я сменил дату, задача не сразу удалилась, а удалилась только после того, как я вернулся на этот фрагмент с другого фрагмента.

Код фрагмента:

public class FragmentHome extends Fragment {

private DBHelper dbHelper;
private ArrayList<Items> elements;
private RecyclerView recyclerView;
private TaskTimeChecker taskTimeChecker;
private TaskAdapter adapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home, container, false);

    taskTimeChecker = new TaskTimeChecker(setZeroTimeDate(new Date()).getTime(),
            getContext());

    dbHelper = new DBHelper(getContext());
    adapter = new TaskAdapter(dbHelper.elementsHome(), "home");

    recyclerView = view.findViewById(R.id.recyclerView);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(layoutManager);
    RecyclerView.ItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
    recyclerView.addItemDecoration(divider);
    recyclerView.setAdapter(adapter);

    return view;
}

@Override
public void onStart() {
    super.onStart();

    taskTimeChecker.checkActiveTasks();

    //.elementsHome() - получение данных из БД 
    elements = dbHelper.elementsHome();
    //.dateChange это тот же notifyDataSetChange, пример ниже
    adapter.dataChange(dbHelper.elementsHome());
}

private Date setZeroTimeDate(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    date = calendar.getTime();
    return date;
}

TaskAdapter.dateChange:

public void dataChange(ArrayList<Items> elements) {
    this.elements = elements;
    notifyDataSetChanged();
}

Ответы (1 шт):

Автор решения: Alex_Skvortsov

Ваш TaskTimeChecker инициализировался в onCreateView. Данный метод жизненного цикла не вызывается повторно при возвращении фрагмента на экран. Так как инициализация включала в себя сохранение текущей даты, после изменения даты на устройстве, изменения TaskTimeChecker не получал.

taskTimeChecker = new TaskTimeChecker(setZeroTimeDate(new Date()).getTime(),
        getContext()); // вот этот кусок кода

Всё, что нужно сделать - перенести инициализацию TaskTimeChecker в метод onStart

→ Ссылка