Обновление данных в RecyclerView с LiveData
Используется RecyclerView и LiveData (Room). В фрагменте, в onCreate делается запрос к Room, возвращающий LiveData. При создании адаптера, в тот момент когда адаптеру передаются данные mTasks, список mTasks еще пустой (видимо так как запрос к Room асинхронный, данные еще не поступили), но по идее, когда будет ответ Room, и поступят данные LiveData, то должен сработать метод mAdapter.notifyDataSetChanged() для обновления RecyclerView. По факту этого не происходит, и RecyclerView пустой, пока не пролистаешь TabLayout и не вернешься на первую вкладку. Если в updateUI() перенести создание адаптера, то всё нормально, но это же неправильно - пересоздавать адаптер, при каждом обновлении списка. Не могу понять почему не срабатывает метод notifyDataSetChanged().
TaskListFragmentOut extends Fragment{
private List<Task> mTasks = new ArrayList<>();
public void onCreate(...){
LiveData <List <Task>> ldTasks = mPresenter.getData();
ldTasks.observe(this, new Observer<List <Task>>() {
@Override
public void onChanged(@Nullable List <Task> value) {
mTasks = value;
updateUI();
}
});
public View onCreateView(...){
mTasksRecyclerView = (RecyclerView) view.findViewById(R.id.task_recycler_view);
mTasksRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
mAdapter = new AdapterRecyclerViewOut(mTasks, getActivity(), this);
mTasksRecyclerView.setAdapter(mAdapter);
}
public void updateUI(){
mAdapter.notifyDataSetChanged();
}
Ответы (1 шт):
Я думаю вы изначально неверно построили взаимодействие с вашим адаптером.
Адаптер не должен ничего знать о LiveData и прочей кухне. Вся задача адаптера это просто отобразить список который ему скормили.
Я бы рекомендовал вам подписку на LiveData вынести во View в которой находится сам адаптер и там на него подписываться. А метод адаптера updateUi() привести к виду вроде этого
public void updateAdapter(List<Task> tasks){
this.tasks = tasks;
notifyDataSetChanged();
}
И по обновлении вашей БД вы будете просто обновлять список внутри адаптера.
То что у вас не обновляется, видимо из-за того, что либо ссылка теряется на саму LiveData либо на ваш список. Тут надо подробнее разбираться