Я новичок в LiveData и в последнее время проводил несколько тестов. У меня есть приложение, в котором мне нужно отображать данные, которые можно фильтровать (имя, категория, дата ...). Фильтры тоже можно комбинировать (имя + дата). Эти данные поступают из вызова API с помощью Retrofit + RX Java.
Я знаю, что могу иметь данные прямо в моем представлении без использования LiveData. Однако я подумал, что было бы интересно использовать ViewModel + LiveData. Во-первых, чтобы проверить, как это работает, а также избежать попытки установить данные, если представление неактивно (благодаря LiveData), и сохранить данные в случае изменений конфигурации (благодаря ViewModel). Это были вещи, с которыми мне приходилось раньше обрабатывать вручную.
Итак, проблема в том, что я не нашел способа легко обрабатывать фильтры с помощью LiveData. В случаях, когда пользователь выбирает один фильтр, мне удалось заставить его работать с помощью switchMap:
return Transformations.switchMap(filter,
filter -> LiveDataReactiveStreams.fromPublisher(
repository.getData(filter).toFlowable(BackpressureStrategy.BUFFER)));
Если он выберет два фильтра, я увидел, что могу использовать настраиваемый MediatorLiveData, и это то, что я сделал. Однако проблема здесь в том, что мой вызов репозитория выполняется столько раз, сколько у меня фильтров и я не могу установить два фильтра одновременно .
Мои персонализированные данные MediatorLiveData:
class CustomLiveData extends MediatorLiveData<Filter> {
CustomLiveData(LiveData<String> name, LiveData<String> category) {
addSource(name, name -> {
setValue(new Filter(name, category.getValue()));
});
addSource(category, category -> {
setValue(new Filter(name.getValue(), newCategory));
});
}
}
CustomLiveData trigger = new CustomLiveData(name, category);
return Transformations.switchMap(trigger,
filter -> LiveDataReactiveStreams.fromPublisher(
repository.getData(filter.getName(), filter.getCategory())
.toFlowable(BackpressureStrategy.BUFFER)));
Хорошо ли я понял использование MediatorLiveData? Можно ли сделать то, что я пытаюсь достичь, с помощью LiveData?
Спасибо!