Обновите все данные фрагментов одновременно с ViewModel - PullRequest
0 голосов
/ 04 сентября 2018

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

Я пытаюсь построить архитектуру, которая использует ViewModel. ViewModel, который будет совместно использоваться всеми моими 12 фрагментами и будет корректно изменять данные (через LiveData) для всех фрагментов, но я не знаю, как использовать этот класс ViewModel для обновления всех видимых фрагментов, вот мой UpcomingGamesFragment класс с методом данных месяца запроса:

public class UpcomingGamesFragment extends Fragment {

public void loadReleaseData(final int refresh) {
    if (mDatabaseLoading == null) {
        Log.d(TAG, "Fragment filter " + mFilter + " [fragment is null]");
        return;
    } else {
        Log.d(TAG, "Updating fragment: " + mFilter);
    }

    if (AppUtil.doesInternetWork(getActivity())) {
        // update, data fetched from firebase 
    }
}

12 фрагментов инициализируются в другом фрагменте, который показан в MainActivity, фрагмент называется UpcomingViewPagerFragment, который создает 12 UpcomingGamesFragment в цикле.

А вот мой ViewModel класс:

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

public ReleasesViewModel() {

}

public LiveData<List<_Release>> getUpcomingFragmentList() {
    return upcomingFragmentLiveData;
}
}

Так, как я могу обновить 12 фрагментов с помощью метода loadReleaseData с учетом жизненного цикла каждого?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вам нужно извлечь объект класса ViewModel во фрагмент и зарегистрировать LiveData, например,

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

в методе onCreate() вашего фрагмента, затем используйте эту модель объекта обзора для наблюдения ваших живых данных, например,

(obj of your view model).getUpcomingFragmentList().observe(this, `your observer for that fragment`);

Для вашего примера:

Это будет вызвано, как только произойдет любое изменение данных для ваших оперативных данных внутри ViewModel

obj.getUpcomingFragmentList().observe(this, new Observer<List<_Release>>() >{
        @Override
        public void onChanged(@Nullable List<_Release> list) {

        }
    });

Если вы не можете найти класс ViewModelProviders, вам нужно добавить здесь зависимости для вашей ViewModel и liveata,

ссылка для добавления модели просмотра и данных в реальном времени в ваш проект

0 голосов
/ 04 сентября 2018

Предполагая, что все содержимое фрагмента является значениями, хранящимися где-то еще в вашем коде, и при условии, что вы корректно обновляете эти значения. Самый простой способ обновить все фрагменты - позвонить:

notifyDataSetChanged();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...