У меня возникла проблема, и в настоящее время я не вижу лучшего решения.
Мои требования: у меня есть изменяемый список изменяемых моделей, и мне нужно сложить большое десятичное число в изменяемой модели.
Вот решение, которое я придумала, но я пытаюсь выяснить, может быть, есть лучший способ.
MyMediatorLiveData<BigDecimal> totalMediator = new MyMediatorLiveData<>();
this.totalHours = Transformations.switchMap(records, input -> {
totalMediator.removeAllSources();
Map<String, BigDecimal> totals = new HashMap<>();
for (LiveData<Record> record : input) {
totalMediator.addSource(record, model -> {
if (model != null) {
totals.put(model.getKey(), model.getTotal());
BigDecimal total = BigDecimal.ZERO;
for (BigDecimal recordTotal : totals.values()) {
total = total.add(recordTotal);
}
totalMediator.setValue(total);
}
});
}
return totalMediator;
});
И вспомогательный класс для уничтожения старых источников-посредников:
public class MyMediatorLiveData<T> extends MediatorLiveData<T> {
private List<LiveData<?>> addedSources = new ArrayList<>();
@Override
public <S> void addSource(@NonNull LiveData<S> source, @NonNull Observer<? super S> onChanged) {
super.addSource(source, onChanged);
addedSources.add(source);
}
public void removeAllSources() {
for (LiveData<?> source : addedSources) {
removeSource(source);
}
}
}
Если кто-то может пролить свет на лучшее решение, я бы все понял, но, возможно, я достиг ограничения шаблона LiveData.
Примечание: я хочу избегать использования RxAndroidпоскольку LiveData, кажется, хочет заменить его.При необходимости я готов к этому приспособиться.