Как указано в этом ответе , ваше решение Transformation.switchMap
С Веб-сайт Android для разработчиков:
LiveData switchMap (триггер LiveData , функция > func)
Создает LiveData, назовем его swLiveData, который следует следующему потоку: он реагирует на
изменения триггера LiveData, применяет данную функцию к новому значению
триггера LiveData и устанавливает результирующие LiveData в качестве «поддержки»
LiveData для swLiveData. «Поддержка» LiveData означает, что все события
его излучение будет повторно передано swLiveData.
В вашей ситуации это будет выглядеть примерно так:
public class CarsViewModel extends ViewModel {
private CarRepository mRepository;
private LiveData<List<Car>> mAllCars;
private LiveData<List<Car>> mCarsFilteredByColor;
private MutableLiveData<String> filterColor = new MutableLiveData<String>();
public CarsViewModel (CarRepository carRepository) {
super(application);
mRepository = carRepository;
mAllCars = mRepository.getAllCars();
mCarsFilteredByColor = Transformations.switchMap(filterColor,
c -> mRepository.getCarsByColor(c));
}
LiveData<List<Car>> getCarsFilteredByColor() { return mCarsFilteredByColor; }
// When you call this function to set a different color, it triggers the new search
void setFilter(String color) { filterColor.setValue(color); }
LiveData<List<Car>>> getAllCars() { return mAllCars; }
}
Поэтому, когда вы вызываете метод setFilter
из своего представления, изменение filterColor LiveData вызовет Transformation.switchMap, который вызовет mRepository.getCarsByColor(c))
, а затем обновит с результатом запроса mCarsFilteredByColor LiveData. Следовательно, если вы наблюдаете этот список в своем представлении и устанавливаете другой цвет, наблюдатель получает новые данные.
Дайте мне знать, если это сработало.