Transformations - особенности работы

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
disaper
Сообщения: 1
Зарегистрирован: 23 мар 2020, 16:44

Transformations - особенности работы

Сообщение disaper » 24 мар 2020, 19:34

Доброе время суток уважаемые знатоки 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 и трансформации?

Ответить