我正在地图上显示数据库中的标记,但是我为用户提供了一个过滤器,用户可以从中调整时间,标记将在该时间显示。我想观察用户每次更改时间过滤器时都会更新的列表。他选择开始时间和结束时间,然后我从数据库中查询以获取具有该条件的列表..我要观察该列表吗?我该怎么办?
我的ViewModel:
public MediatorLiveData<List<LocationTracking>> fetchData(LiveData<List<LocationTracking>> source){
if (oldSource == null){
oldSource = source;
} else {
list.removeSource(oldSource);
}
list.addSource(source, locationTrackings -> {
list.postValue(locationTrackings);
});
return list;
}
在我的活动中,我正在这样做:
在我的数据库中插入新值时,不要求我的回调进行更改。任何帮助将不胜感激。
当用户希望查看没有时间过滤器的整个列表时。
mViewModel.fetchData(mViewModel.getFilteredLocationList(
mDataRange.get(0).getTimeStamp(),
mDataRange.get(1).getTimeStamp()
)).observe(this,mFilteredListObserver);
当用户选择时间过滤器时。
mViewModel.fetchData(mViewModel.getFilteredLocationList(
data.getLongExtra(LocationsFilterActivity.START_TIME, 0),
data.getLongExtra(LocationsFilterActivity.END_TIME, 0)
)).observe(this,mFilteredListObserver);
答案 0 :(得分:0)
我一直在努力解决类似的问题。一旦您了解了解决方案,它就非常简单。您需要在ViewModel中执行以下操作:
private MutableLiveData<DataRange> dataRange = new MutableLiveData<DataRange>();
public LiveData<List<LocationTracking>> list = Transformations.switchMap(dataRange,
newDataRangeValue -> getFilteredLocationList(
newDataRangeValue.get(0).getTimeStamp(),
newDataRangeValue.get(1).getTimeStamp())
);
public void onDataRangeChanged(DataRange dataRange) {
this.dataRange.setValue(dataRange);
}
在“活动”中,观察list
。 switchMap()
方法将侦听dataRange
上的所有更改,因此,如果您执行mViewModel.onDataRangeChanged(newDataRange)
,将再次调用getFilteredLocationList()
,并且list
将在Activity中进行更新。 / p>
我强烈建议您阅读this great article。