首页 > 解决方案 > 使用 ViewModel 同时更新所有片段数据

问题描述

我有 12 个片段UpcomingGamesFragment,每年每个月重复 12 次,各自的片段显示该月的游戏发布。例如,第一个月将显示 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 个片段呢?

标签: androidandroid-fragments

解决方案


您需要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 添加依赖项,

将视图模型和实时数据添加到您的项目的链接


推荐阅读