#java #android #android-fragments #android-mvvm
Вопрос:
Мне нужно наблюдать за изменениями livedata в представлении модели, чтобы обновить фрагмент (добавив список в представление для повторного использования).
Реализация работает правильно, но сталкивается с проблемами при переключении между фрагментами.
Если реализация включена Fragment A
, когда пользователь переключается на Fragment B
, а затем возвращается ко Fragment A
второму наблюдателю livedata, запускается. (Данные в recyclerview дублируются) и так далее…
Я провел некоторое исследование жизненного цикла фрагмента и необходимости удаления наблюдателя при перемещении между фрагментами (либо при отсоединении/уничтожении фрагмента), либо перед созданием нового наблюдателя в onActivityCreated. Но все это работало.
Я наблюдаю за живыми данными как: mViewModel.getDetails().observe(getViewLifecycleOwner(), mObserver);
И попытался удалить наблюдателя как: mViewModel.getDetails().removeObservers(getViewLifecycleOwner())
или mViewModel.getDetails().removeObservers(this)
или mViewModel.getDetails().removeObserver(mObserver)
попытался войти OnViewCreated
и onDestroyView
и onDestory
и onDetach
Что является причиной этого и почему удаление наблюдателя не работает?
к вашему сведению:
Вот функция, которую я использую MainActivity
для переключения между фрагментами в меню навигации.
private boolean loadFragment(Fragment fragment) {
//switching fragment
if (fragment != null) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
return true;
}
return false;
}
Комментарии:
1. пожалуйста, предоставьте более подробную информацию. поделитесь своей моделью просмотра и обоими фрагментами. Я думаю, что дело не в том, как вы загружаете новый фрагмент.
2. В чем может быть проблема? Разве он не независим от другого фрагмента и модели представления, поскольку функциональность верна до переключения фрагментов?
Ответ №1:
Попробуйте установить значение null после
mViewModel.getDetails().removeObservers(getViewLifecycleOwner()).
mViewModel.getDetails().setValue(null)
Комментарии:
1. Это установило бы значение null в представлении модели. Неправильный Ответ