在我的viewModel中观察liveData列表时遇到麻烦吗?

问题描述 投票:0回答:1

我正在地图上显示数据库中的标记,但是我为用户提供了一个过滤器,用户可以从中调整时间,标记将在该时间显示。我想观察用户每次更改时间过滤器时都会更新的列表。他选择开始时间和结束时间,然后我从数据库中查询以获取具有该条件的列表..我要观察该列表吗?我该怎么办?

我的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);
android viewmodel android-livedata observers mutablelivedata
1个回答
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);
}

在您的活动中观察listswitchMap()方法将侦听dataRange上的所有更改,因此,如果执行mViewModel.onDataRangeChanged(newDataRange),则会再次调用getFilteredLocationList(),并且[Activity]中的list将被更新。

我强烈建议您阅读this great article

© www.soinside.com 2019 - 2024. All rights reserved.