在查看viewModel中的liveData列表时遇到麻烦吗?

时间:2019-10-22 11:07:19

标签: android viewmodel android-livedata observers mutablelivedata

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

我的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);

1 个答案:

答案 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);
}

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

我强烈建议您阅读this great article