使用ViewModel同时更新所有片段数据

时间:2018-09-04 01:42:12

标签: android android-fragments

我有12个片段UpcomingGamesFragment,每年的每个月重复十二次,各自的片段显示该月的游戏版本。例如,第一个月将显示2019年1月发布的游戏,下一个片断将包含2019年2月发布的游戏,等等。

我要构建的是使用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;
}
}

那么如何使用loadReleaseData方法更新12个片段,并计算每个片段的生命周期?

2 个答案:

答案 0 :(得分:0)

假定所有片段内容都是代码中其他位置保存的值,并假定您正确更新了这些值。相应地更新所有片段的最简单方法是调用:

notifyDataSetChanged();

答案 1 :(得分:0)

您需要在片段中检索ViewModel类对象,并从中注册LiveData

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

在片段的onCreate()方法中,然后使用视图模型的obj来观察实时数据,例如,

(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和livedata添加依赖项,

link to add view model & live data to your project

相关问题