Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在查看我的viewModel中的liveData列表时遇到问题?_Android_Viewmodel_Android Livedata_Observers_Mutablelivedata - Fatal编程技术网

Android 在查看我的viewModel中的liveData列表时遇到问题?

Android 在查看我的viewModel中的liveData列表时遇到问题?,android,viewmodel,android-livedata,observers,mutablelivedata,Android,Viewmodel,Android Livedata,Observers,Mutablelivedata,我正在地图上显示数据库中的标记,但我为用户提供了一个过滤器,用户可以从中调整时间,标记将在该时间内显示。我希望观察每次用户更改时间过滤器时更新的列表。他选择一个开始时间和结束时间,我从数据库中查询得到一个包含该条件的列表。。我想遵守这份清单吗?我该怎么做 我的ViewModel: public MediatorLiveData<List<LocationTracking>> fetchData(LiveData<List<LocationTrack

我正在地图上显示数据库中的标记,但我为用户提供了一个过滤器,用户可以从中调整时间,标记将在该时间内显示。我希望观察每次用户更改时间过滤器时更新的列表。他选择一个开始时间和结束时间,我从数据库中查询得到一个包含该条件的列表。。我想遵守这份清单吗?我该怎么做

我的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);
}
当用户选择时间过滤器时

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您解决问题了吗?如果我的回答有帮助,请告诉我。