问题描述
我有一个 liveData 列表,比如 List<LiveData<String>>
。我想观察这个列表,以便每当 String
中的 LiveData
发生变化时,它都会用这个 String
通知列表的观察者。
我该怎么做?
我的列表元素是严格的 LiveData<String>
,所以不能简化为 String
。
我知道如何观察 LiveData<String>
,但不知道如何观察 List<LiveData<String>>
。
请帮忙。
编辑:
列表的元素是 LiveData<String>
,因为 String
它来自互联网。因此,列表元素持有 LiveData<String>
的对象。
解决方法
如果你想观察一个 List<LiveData<String>>
,你必须为列表的每个元素附加一个观察者。列表本身是不可观察的,只能观察到它的每个 LiveData 元素。所以,简单地说:
- 迭代列表
- 观察每个 LiveData 元素
- 决定你想对每个观察到的元素做什么
我知道如何观察 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 特定的代码。