如何更改视图模型中的实时数据实例?
How to change a live data instance in view model?
我在 onCreate() 中设置一个房间查询,returns 我在下面观察到的实时数据实例。
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 中 class
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;
}
知道我做错了什么吗?
您的问题是您替换了附加了 Observer 的对象。
这意味着您的观察者未附加到新的 QueryMediaList,因此每次更改查询时都需要重置它们。
为此,您可以将 Observer 提取到它自己的变量中,然后在更改查询后将该变量重新附加到列表中。
正确的做法是将 directoryPath
放入 MutableLiveData<String>
,然后对其执行 Transformations.switchMap
以更新您实际观察到的 LiveData你的 Activity/Fragment.
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();
}
});
我在 onCreate() 中设置一个房间查询,returns 我在下面观察到的实时数据实例。
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 中 class
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;
}
知道我做错了什么吗?
您的问题是您替换了附加了 Observer 的对象。 这意味着您的观察者未附加到新的 QueryMediaList,因此每次更改查询时都需要重置它们。 为此,您可以将 Observer 提取到它自己的变量中,然后在更改查询后将该变量重新附加到列表中。
正确的做法是将 directoryPath
放入 MutableLiveData<String>
,然后对其执行 Transformations.switchMap
以更新您实际观察到的 LiveData你的 Activity/Fragment.
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();
}
});