观察 java

问题描述

我有一个 liveData 列表,比如 List<LiveData<String>>。我想观察这个列表,以便每当 String 中的 LiveData 发生变化时,它都会用这个 String 通知列表的观察者。
我该怎么做?
我的列表元素是严格的 LiveData<String>,所以不能简化为 String
我知道如何观察 LiveData<String>,但不知道如何观察 List<LiveData<String>>
请帮忙。

编辑:

列表的元素是 LiveData<String>,因为 String 它来自互联网。因此,列表元素持有 LiveData<String> 的对象。

解决方法

如果你想观察一个 List<LiveData<String>>,你必须为列表的每个元素附加一个观察者。列表本身是不可观察的,只能观察到它的每个 LiveData 元素。所以,简单地说:

  1. 迭代列表
  2. 观察每个 LiveData 元素
  3. 决定你想对每个观察到的元素做什么
,

我知道如何观察 LiveData,但不知道如何观察 List

这并不难,您只需将 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 特定的代码。