Соблюдайте список живых данных в java

У меня есть список liveData, например List<LiveData<String>>. Я хочу наблюдать за этим списком, чтобы всякий раз, когда String внутри LiveData изменяется, он уведомлял наблюдателя списка с этим String.
Как я могу это сделать?
Мои элементы списка строго LiveData<String>, поэтому, его нельзя упростить до String.
Я умею наблюдать LiveData<String>, но не List<LiveData<String>>.
Пожалуйста, помогите.

Редактировать:

Элемент списка LiveData<String>, потому что String он поступает из Интернета. Итак, элементы списка содержат объект LiveData<String>.


person enthusiast    schedule 19.12.2020    source источник
comment
Но если у каждого LiveData есть свой наблюдатель, вы уже достигаете того, к чему стремитесь... Независимо от того, где хранится LiveData (в вашем примере это список), он будет уведомлять вас об изменениях в нем.   -  person aran    schedule 19.12.2020


Ответы (2)


Если вы хотите наблюдать за List<LiveData<String>>, вам придется прикрепить наблюдателя к каждому элементу списка. Сам список не просматривается, только каждый его элемент LiveData. Итак, просто:

  1. Повторить список
  2. Наблюдайте за каждым элементом LiveData
  3. Решите, что вы хотите сделать для каждого наблюдаемого элемента
person Doug Stevenson    schedule 19.12.2020
comment
Как я могу выполнить шаг 2? Как я могу прикрепить и отслеживать каждого наблюдателя для каждого элемента списка? - person enthusiast; 19.12.2020
comment
Вы можете наблюдать LiveData, как показано в документации. developer.android.com/topic/libraries/architecture/ - person Doug Stevenson; 19.12.2020

Я умею наблюдать 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.

person EpicPandaForce    schedule 21.12.2020