Я использую Transformations.switchMap
в своей модели просмотра, поэтому моя LiveData
коллекция в моем фрагменте, реагирует на изменение параметра code
.
Это отлично работает:
public class MyViewModel extends AndroidViewModel {
private final LiveData<DayPrices> dayPrices;
private final MutableLiveData<String> code = new MutableLiveData<>();
// private final MutableLiveData<Integer> nbDays = new MutableLiveData<>();
private final DBManager dbManager;
public MyViewModel(Application application) {
super(application);
dbManager = new DBManager(application.getApplicationContext());
dayPrices = Transformations.switchMap(
code,
value -> dbManager.getDayPriceData(value/*, nbDays*/)
);
}
public LiveData<DayPrices> getDayPrices() {
return dayPrices;
}
public void setCode(String code) {
this.code.setValue(code);
}
/*public void setNbDays(int nbDays) {
this.nbDays.setValue(nbDays);
}*/
}
public class MyFragment extends Fragment {
private MyViewModel myViewModel;
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
myViewModel.setCode("SO");
//myViewModel.setNbDays(30);
myViewModel.getDayPrices().observe(MyFragment.this, dataList -> {
// update UI with data from dataList
});
}
Проблема
Теперь мне нужен еще один параметр (nbDays
прокомментирован в приведенном выше коде), чтобы мой объект LiveData
реагировал на изменение обоих параметров (code
и nbDays
).
Как я могу связать преобразования?
Некоторые читатели указали мне на MediatorLiveData, но это не решает мою проблему. проблема (все еще нужно вызвать одну функцию БД с 2 параметрами, мне не нужно объединять 2 liveDatas).
Поэтому я попробовал это вместо switchMap
, но code
и nbDays
всегда равны нулю.
dayPrices.addSource(
dbManager.getDayPriceData(code.getValue(), nbDays.getValue),
apiResponse -> dayPrices.setValue(apiResponse)
);
Одним из решений было бы передать объект как единственный параметр, я уверен, что есть простое решение для этого.