Viewmodel Livedata不会更新数据观察者

时间:2018-09-07 03:20:23

标签: android android-fragments android-lifecycle android-livedata android-viewmodel

例如,我有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;
    }
}

在我的MainActivity中的Filter抽屉布局中,我也在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);
        }
    });
}

我怎么知道实时数据不会更新我所有的片段?这是因为我的loadReleasesData方法中有一个日志,并且它没有在Logcat中打印,更不用说它不会更新片段了。祝你有美好的一天,再见! :)

1 个答案:

答案 0 :(得分:1)

您遇到的问题不是LiveData,而是ViewModel实例,您将进入ViewPagerFragment

在您的onCreateView()片段中使用它:

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

代替您的代码:

// Get the ViewModel
ReleasesViewModel releasesViewModel = ((MainActivity)getActivity()).mReleasesViewModel;