#java #android-livedata #android-architecture-components #mutablelivedata
#java #android-livedata #android-архитектура-компоненты #изменяемые живые данные
Вопрос:
У меня есть список живых данных, например List<LiveData<String>>
. Я хочу наблюдать за этим списком, чтобы всякий String
раз, когда внутри LiveData
происходят изменения, он уведомлял наблюдателя о списке этим String
.
Как я могу это сделать?
Мои элементы списка строго LiveData<String>
таковы, что их нельзя упростить String
.
Я знаю, как наблюдать LiveData<String>
, но нет List<LiveData<String>>
.
Пожалуйста, помогите.
Редактировать:
Элемент списка
LiveData<String>
связан с тем, чтоString
он поступает из Интернета. Итак, элементы списка содержат объектLiveData<String>
.
Комментарии:
1. Но, если у каждого LiveData есть свой собственный наблюдатель, вы уже достигли своей цели … Независимо от того, где хранятся LiveData (в вашем примере, список), он уведомит вас об изменениях в нем
Ответ №1:
Если вы хотите наблюдать a List<LiveData<String>>
, вам нужно будет прикрепить наблюдателя к каждому элементу списка. Сам список не является наблюдаемым, только каждый его элемент LiveData. Итак, просто:
- Повторите список
- Наблюдайте за каждым элементом LiveData
- Решите, что вы хотите сделать для каждого наблюдаемого элемента
Комментарии:
1. Как я могу выполнить шаг 2? Как я могу прикрепить и отслеживать каждого наблюдателя для каждого элемента списка?
2. Вы можете просматривать текущие данные, как показано в документации. developer.android.com/topic/libraries/architecture /…
Ответ №2:
Я знаю, как наблюдать за LiveData, но не List<LiveData> .
Это не так сложно, все, что вам нужно сделать, это поменять List<LiveData<String>>
местами, чтобы стать LiveData<List<String>>
.
Для этого вы можете использовать MediatorLiveData
.
fun <T> List<LiveData<T>>.combineList(): LiveData<List<T>> = MediatorLiveData<List<T>>().also { mediator ->
val mutableList = this.map { it.value }.toMutableList()
mediator.value = ArrayList(mutableList).toList()
forEachIndexed { index, liveData ->
addSource(liveData) { value
mutableList[index] = value
mediator.value = ArrayList(mutableList).toList()
}
}
}
Который должен быть наблюдаемым с помощью одного наблюдателя
strings.combineList().observe(viewLifecycleOwner) { listOfStrings -> ... }
Весь код напрямую конвертируется в Java, в этом ответе не используется ничего специфичного для Kotlin.