В случаях когда один тип LiveData требуется преобразовать в другой, используют медиаторы.
Этот класс является частью пакета androidx.lifecycle.
Например, у нас есть тип LiveData<List<T>> а мы хотим преобразовать его к LiveData<List<V>>, где T и V разные типы. Тогда функция преобразования может выглядеть вот так:
1 2 3 4 5 6 7 8 |
fun <T,V>getLDV(src: LiveData<List<T>>): LiveData<List<V>> { val mld = MediatorLiveData<List<V>>().apply { addSource(src) { value = mapper.mapListTToV(it) } } return mld } |
Нам понадобится конечно же функция собственно приведения T к V, я её обозначил как некий mapper с методом преобразования одного типа к другому.
В методе addSource мы передаём исходную LiveData, и реализуем наблюдателя onChanged, в котором выполняем преобразование.
Т.е. вам не нужно пересоздавать и переподписываться на LiveData<T>, вы можете с помощью медиатора создать специальный объект, подписанный на вашу LiveData<T>, который будет отдавать вам данные в виде LiveData<V>.
В показанном выше примере, я демонстрирую это для LiveData<List<T> с использованием mapper, что является хорошим шаблоном проектирования, когда создаётся специальный класс для приведения одного типа к другому. В этом классе могут быть реализованы не только методы T -> V, V -> T, то и преобразования списков и более сложные случаи, которые требуются в приложении.