我认为您可以使用 MediatorLiveData 解决此问题。
特别是 Transformations.switchMap 和一些额外的魔法。
目前我正在使用
public void reloadTasks() {
if(liveResults != null) {
liveResults.removeObserver(this);
}
liveResults = getFilteredResults();
liveResults.observeForever(this);
}
但是如果你仔细想想,你应该可以不使用observeForever来解决这个问题,特别是如果我们认为switchMap也在做类似的事情。
所以我们需要一个 LiveData,它被开关映射到我们需要的 LiveData>。
private MutableLiveData<String> filterText = new MutableLiveData<>();
private final LiveData<List<T>> data;
public MyViewModel() {
data = Transformations.switchMap(
filterText,
(input) -> {
if(input == null || input.equals("")) {
return repository.getData();
} else {
return repository.getFilteredData(input); }
}
});
}
public LiveData<List<T>> getData() {
return data;
}
这样,从一个到另一个的实际更改由 MediatorLiveData 处理。如果我们想要缓存 LiveData,那么我们可以在传递给方法的匿名实例中进行。
data = Transformations.switchMap(
filterText, new Function<String, LiveData<List<T>>>() {
private Map<String, LiveData<List<T>>> cachedLiveData = new HashMap<>();
@Override
public LiveData<List<T>> apply(String input) {
// ...
}
}