如何在视图模型中更改实时数据实例?

时间:2019-03-25 17:33:55

标签: android android-livedata android-jetpack

我正在onCreate()中设置一个房间查询,该查询将返回一个我在下面观察到的实时数据实例。

viewModel.setmQueryMediaList(null, MediaUtils.DATE_TAKEN_KEY, MediaUtils.DATE_TAKEN_KEY);

viewModel.getmQueryMediaList().observe(MainActivity.this, new Observer<List<MediaStoreData>>() {
        @Override
        public void onChanged(@Nullable List<MediaStoreData> mediaStoreDataList) {
            List<MediaStoreData> sectionedMediaStoreDataList = MediaUtils.getSectionedList(getBaseContext(), mediaStoreDataList, MediaUtils.ORDER_BY_MONTH );
            mRecyclerViewAdapter.submitList(sectionedMediaStoreDataList);
            Log.e("MediaDatabase", "something changed! Size:" + (mediaStoreDataList != null ? mediaStoreDataList.size() : 0));
        }
    });

onClick()我想更改房间查询,并且我假定观察者会触发该更改,但不会触发。

@Override
public void onAlbumClicked(AlbumData albumData, TextView titleView) {
    viewModel.setmQueryMediaList(albumData.getDirectory_path(), null, MediaUtils.DATE_TAKEN_KEY);
    mSlidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
}

这是在我的ViewModel类中

public void setmQueryMediaList(String directory_path, String sectionOrder, String sortOrder) {
    if(directory_path != null){
        this.mQueryMediaList = mediaDatabase.mediaDao().getAllByName();
    } else {
        this.mQueryMediaList = mediaDatabase.mediaDao().getAllByDate();
    }
}

public LiveData<List<MediaStoreData>> getmQueryMediaList(){
    return mQueryMediaList;
}

有什么想法我做错了吗?

2 个答案:

答案 0 :(得分:1)

您的问题是您替换了附带观察者的对象。 这意味着您的Obserers未附加到新的QueryMediaList,因此每次更改查询时都需要将其重置。 为此,您可以将Observer提取到其自己的变量中,然后在更改查询后将该变量重新分配到列表中。

答案 1 :(得分:1)

执行此操作的正确方法是将directoryPath放在MutableLiveData<String>中,然后执行Transformations.switchMap以更新实际从“活动”中观察到的LiveData /片段。

public void setmQueryMediaList(String directoryPath, String sectionOrder, String sortOrder) {
    directoryPathLiveData.setValue(directoryPath);
}

mQueryMediaList = Transformations.switchMap(directoryPathLiveData, (directoryPath) -> {
    if(directory_path != null){
        return mediaDatabase.mediaDao().getAllByName();
    } else {
        return mediaDatabase.mediaDao().getAllByDate();
    }
});