观察 java 中的实时数据列表
Observe list of live data in java
我有一个 liveData 列表,比如 List<LiveData<String>>
。我想观察这个列表,这样每当 LiveData
中的 String
发生变化时,它就会用这个 String
.
通知列表的观察者
我该怎么做?
我的列表元素是严格的 LiveData<String>
所以,它不能简化为 String
.
我知道如何观察 LiveData<String>
,但不会观察 List<LiveData<String>>
。
请帮忙。
Edit:
The element of the list is LiveData<String>
because the String
it is coming from the internet. So, list elements are holding object of LiveData<String>
.
如果要观察 List<LiveData<String>>
,则必须为列表的每个元素附加一个观察者。列表本身不可观察,只能观察其中的每个 LiveData 元素。所以,简单地说:
- 迭代列表
- 观察每个 LiveData 元素
- 决定你想对每个观察到的元素做什么
I know how to observe LiveData, but not 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 特定代码。
我有一个 liveData 列表,比如 List<LiveData<String>>
。我想观察这个列表,这样每当 LiveData
中的 String
发生变化时,它就会用这个 String
.
通知列表的观察者
我该怎么做?
我的列表元素是严格的 LiveData<String>
所以,它不能简化为 String
.
我知道如何观察 LiveData<String>
,但不会观察 List<LiveData<String>>
。
请帮忙。
Edit:
The element of the list is
LiveData<String>
because theString
it is coming from the internet. So, list elements are holding object ofLiveData<String>
.
如果要观察 List<LiveData<String>>
,则必须为列表的每个元素附加一个观察者。列表本身不可观察,只能观察其中的每个 LiveData 元素。所以,简单地说:
- 迭代列表
- 观察每个 LiveData 元素
- 决定你想对每个观察到的元素做什么
I know how to observe LiveData, but not 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 特定代码。