Доброе время суток уважаемые знатоки android!
Дано - Viewmodel с проперти:
Код: Выделить всё
public MutableLiveData<ItemEntity> selectedItem = new MutableLiveData<ItemEntity>();
которая при изменении через Transformations, должна вытаскивать список:
Код: Выделить всё
private LiveData<List<FileEntity>> filesSelectedItem = Transformations.switchMap(selectedItem, selectedItem -> {
return itemRepository.getItemFiles(selectedItem);
});
public LiveData<List<FileEntity>> getSelectedItemFiles() {
return filesSelectedItem;
}
в свою очередь есть Fragment, в onCreateView которого:
Код: Выделить всё
viewModel.getSelectedItemFiles().observe(getViewLifecycleOwner(), new Observer<List<FileEntity>>() {
@Override
public void onChanged(@Nullable List<FileEntity> fileEntities) {
fileAdapter.setItems(fileEntities);
}
});
При открытии фрагмента в первый раз (без разницы какое значение у selectedItem ) все отрабатывает нормально, но при его закрытии и перехода к следующему элементу списка (selectedItem меняется, через него фрагменту передается айдишник сущности файлы которой он запрашивает) и открытию нового фрагмента, onChanged у getSelectedItemFiles() срабатывает два раза, первый раз с fileEntities от предыдущего selectedItem, второй раз уже как положено с fileEntities текущего значения selectedItem, после гугления нашел информацию что трансформация не отрабатывает если нет существующих observe-ров, навешанных на getSelectedItemFiles, и соответственно для второго открытия фрагмента getSelectedItemFiles первый раз возвращает то что у него лежало в dataholder (поле mData у MediatorLiveData?) и только после того как отрабатывает трансформация onChanged возвращает fileEntities текущего элемента. Как костыль я пока сделал в конструкторе ViewModel
Код: Выделить всё
filesSelectedItem.observeForever(new Observer<List<FileEntity>>() {
@Override
public void onChanged(List<FileEntity> fileEntities) {
int nlen = fileEntities.size();
}
});
Можно ли сделать это без костылей, но с использованием LiveData и трансформации?