Просмотр списка текущих данных в java

#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. Итак, просто:

  1. Повторите список
  2. Наблюдайте за каждым элементом LiveData
  3. Решите, что вы хотите сделать для каждого наблюдаемого элемента

Комментарии:

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.