Viewmodel Livedata не обновляет наблюдателей данных

Например, у меня есть 12 UpcomingGamesFragment, и каждый фрагмент имеет другой набор игровых данных, выпускаемых в месяц, например, в первом фрагменте из 12 видеоигры будут выпущены в январе 2019 года.

В моем приложении есть панель навигации со списком платформ (ps4, xbox, pc и т. Д.), И когда пользователь выбирает свои консоли, нажимая флажки, а затем закрывает макет ящика, я хочу, чтобы все фрагменты обновлялись. соответственно. Вроде только показывать игры, выпускаемые на этих платформах. Получение и фильтрация успешно работают с помощью метода в UpcomingGamesFragment под названием loadReleasesData()

Теперь я хочу, чтобы все фрагменты обновлялись, когда панель навигации закрывается, потому что моя реализация не работает, скажите, пожалуйста, что не так.

Вот мой класс ViewModel:

public class ReleasesViewModel extends ViewModel {
    private MutableLiveData<List<_Release>> upcomingReleases = new MutableLiveData<>();

    public ReleasesViewModel() { }

    public MutableLiveData<List<_Release>> getUpcomingReleases() {
        return upcomingReleases;
    }
}

И в моем макете ящика фильтров в моем MainActivity, а также я объявляю свою ViewModel в моем MainActivity:

OnCreate (большая часть кода опущена для ясности)

mReleasesViewModel = ViewModelProviders.of(this).get(ReleasesViewModel.class);

Макет моего ящика при закрытии:

@Override
public void onDrawerClosed(@NonNull View drawerView) {
    // If change detected refresh!
    if (!mCopyOfUserPlatforms.equals(SharedPrefManager.read(SharedPrefManager.PLATFORM_IDS, mDefaultPlatformsSet))) {
        mReleasesViewModel.getUpcomingReleases().setValue(new ArrayList<_Release>());
    }
}

И я передаю объект liveata модели представления своим 12 фрагментам, когда я инициализирую их в другом фрагменте, называемом ViewPagerFragment, вот как:

onCreateView:

   // Get the ViewModel
    ReleasesViewModel releasesViewModel = ((MainActivity)getActivity()).mReleasesViewModel;
    for (int i = 0; i < 14; i++) {
        UpcomingGamesFragment upcomingGamesFragment = new UpcomingGamesFragment();
        upcomingGamesFragment.setLiveData(releasesViewModel); // HERE 
        mSectionsPagerAdapter.addFragment(upcomingGamesFragment, title, queryId);
    }

Это мой метод setLiveData () в UpcomingGamesFragment:

public void setLiveData(ReleasesViewModel releasesViewModel) {
    releasesViewModel.getUpcomingReleases().observe(this, new android.arch.lifecycle.Observer<List<_Release>>() {
        @Override
        public void onChanged(@Nullable List<_Release> releases) {
            Log.d(TAG, "Refreshing this baby boy...");
            loadReleaseData(0);
        }
    });
}

Как я узнаю, что liveata обновляет не все мои фрагменты? Это потому, что у меня есть журнал в моем методе loadReleasesData, и он не печатается в Logcat, не говоря уже о том, что он не обновляет фрагмент (ы). Хорошего дня и до свидания! :)


person Community    schedule 07.09.2018    source источник


Ответы (1)


Ваша проблема не в LiveData, а в ViewModel экземпляре, который вы попали в ViewPagerFragment:

используйте это в своем onCreateView() фрагменте:

ReleasesViewModel releasesViewModel = ViewModelProviders.of(getActivity()).get(ReleasesViewModel.class);

вместо вашего кода:

// Get the ViewModel
ReleasesViewModel releasesViewModel = ((MainActivity)getActivity()).mReleasesViewModel;
person Jeel Vankhede    schedule 07.09.2018
comment
Спасибо, но все равно не работает, не обновляется - person ; 08.09.2018
comment
Можете ли вы сказать только для подтверждения: вы используете модель просмотра в классе фрагментов, где вы хотите получать данные? @Johnny Boy - person Jeel Vankhede; 08.09.2018
comment
Я использую это, но, может быть, не лучшим образом. Как вы хотите, чтобы я его использовал? - person ; 08.09.2018
comment
Используйте ReleasesViewModel releasesViewModel = ViewModelProviders.of(getActivity()).get(ReleasesViewModel.class); эту строку в Fragment, который вы хотите получить LiveData, для вашего экземпляра она будет в UpcomingGamesFragment и зарегистрируйтесь в LiveData в этом фрагменте. - person Jeel Vankhede; 10.09.2018