Использование ViewModel для получения живых данных в Android фрагменте

#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 в представлении модели. Неправильный Ответ