Не обновляется 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 шт):
Ваш TaskTimeChecker инициализировался в onCreateView. Данный метод жизненного цикла не вызывается повторно при возвращении фрагмента на экран. Так как инициализация включала в себя сохранение текущей даты, после изменения даты на устройстве, изменения TaskTimeChecker не получал.
taskTimeChecker = new TaskTimeChecker(setZeroTimeDate(new Date()).getTime(),
getContext()); // вот этот кусок кода
Всё, что нужно сделать - перенести инициализацию TaskTimeChecker в метод onStart