У меня есть фрагмент, который имеет RecyclerView
, показывающий список от наблюдателя, который наблюдает за изменениями в данных списка из комнаты db. Это работает так - FragmentA
имеет список RecyclerView
, и когда пользователь щелкает элемент, он открывает (заменяет) другой FragmentB
, который является фрагментом детализации списка, где пользователь может редактировать элемент детализации списка и сохранять его (обновлять в db), и LiveData
выполнит свою работу и обновит список. Но когда я нажимаю кнопку «Назад», представление FragmentA
воссоздается, и другой идентичный наблюдатель подписывается, как показано в коде ниже -
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setupUI(view);
viewModel.getInspections().observe(this, inspectionsList -> {
setUpMainAdapter(inspectionsList); //setting Recyclerview adapter on recyclerview.
})
}
Я нашел решение этой проблемы в этой статье , где написано использовать getViewLifecycleOwner()
вместо this
, чтобы наблюдатели также отписывались при изменении иерархии представления фрагмента. Теперь моя проблема в том, что, если я вернусь к FragmentA
из FragmentB
, снова будет вызван setUpMainAdapter()
, и в обзоре утилизатора устанавливается новый адаптер. Пока я проверяю старый экземпляр адаптера еще жив. Если я сделаю adapter.notifyItemChanged(position)
, то это не сработает, и в окне переработчика нечего показать (потому что представление было воссоздано). Итак, правильная ли здесь настройка адаптера для ресивлера? Потому что странно настраивать основной адаптер снова и снова, и он не может использовать методы уведомления адаптера, чтобы просто обновить элемент.