Android 在查看我的viewModel中的liveData列表时遇到问题?
我正在地图上显示数据库中的标记,但我为用户提供了一个过滤器,用户可以从中调整时间,标记将在该时间内显示。我希望观察每次用户更改时间过滤器时更新的列表。他选择一个开始时间和结束时间,我从数据库中查询得到一个包含该条件的列表。。我想遵守这份清单吗?我该怎么做 我的ViewModel:Android 在查看我的viewModel中的liveData列表时遇到问题?,android,viewmodel,android-livedata,observers,mutablelivedata,Android,Viewmodel,Android Livedata,Observers,Mutablelivedata,我正在地图上显示数据库中的标记,但我为用户提供了一个过滤器,用户可以从中调整时间,标记将在该时间内显示。我希望观察每次用户更改时间过滤器时更新的列表。他选择一个开始时间和结束时间,我从数据库中查询得到一个包含该条件的列表。。我想遵守这份清单吗?我该怎么做 我的ViewModel: public MediatorLiveData<List<LocationTracking>> fetchData(LiveData<List<LocationTrack
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;
}
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);
}
当用户选择时间过滤器时
mViewModel.fetchData(mViewModel.getFilteredLocationList(
data.getLongExtra(LocationsFilterActivity.START_TIME, 0),
data.getLongExtra(LocationsFilterActivity.END_TIME, 0)
)).observe(this,mFilteredListObserver);
我也遇到过类似的问题。一旦你理解了解决方案,它就相当简单了。您需要在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;
}
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);
}
private MutableLiveData dataRange=new MutableLiveData();
public LiveData list=Transformations.switchMap(数据范围,
newDataRangeValue->getFilteredLocationList(
newDataRangeValue.get(0.getTimeStamp(),
newDataRangeValue.get(1.getTimeStamp())
);
公共无效OnDataRange已更改(DataRange DataRange){
this.dataRange.setValue(dataRange);
}
在您的活动中,请遵守列表
。switchMap()
方法将侦听dataRange
上的任何更改,因此如果执行mViewModel.onDataRangeChanged(newDataRange)
,将再次调用getFilteredLocationList()
,并在活动中更新list
我强烈建议阅读。您第一次进入屏幕时是否从数据库中获取标记?@MuhammadAwais否,我仅在单击按钮或用户设置时间范围时获取标记。@MuhammadAbdullah您解决问题了吗?如果我的回答有帮助,请告诉我。