例如,我有12个UpcomingGamesFragment
,每个片段有一组不同的游戏数据发布一个月,例如12的第一个片段将在2019年1月发布视频游戏。
在我的应用程序中,有一个带有平台列表的导航抽屉(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;
}
}
在我的Filter抽屉布局中,我的MainActivity中,我还在MainActivity中声明了我的ViewModel:
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>());
}
}
当我在另一个名为ViewPagerFragment
的片段中初始化它们时,我将viewmodel livedata对象传递给我的12个片段:
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);
}
这是我在UpcomingGamesFragment中的setLiveData()方法:
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);
}
});
}
我怎么知道livingata不会更新我的所有碎片?这是因为我有一个登录我的loadReleasesData方法,它没有在Logcat中打印,更不用说它不更新片段的事实。祝你有个美好的一天! :)
你的问题不是LiveData
,而是ViewModel
实例,你进入ViewPagerFragment
:
在你的onCreateView()
片段中使用它:
ReleasesViewModel releasesViewModel = ViewModelProviders.of(getActivity()).get(ReleasesViewModel.class);
而不是你的代码:
// Get the ViewModel
ReleasesViewModel releasesViewModel = ((MainActivity)getActivity()).mReleasesViewModel;