观察java中的实时数据列表
我有一个liveData列表,比如观察java中的实时数据列表,java,android-livedata,android-architecture-components,mutablelivedata,Java,Android Livedata,Android Architecture Components,Mutablelivedata,我有一个liveData列表,比如list。我希望观察此列表,以便每当LiveData中的String发生变化时,它都会用此字符串通知观察者此列表 我该怎么做? 我的列表元素是严格的LiveData,因此不能简化为String 我知道如何观察LiveData,但不知道List 请帮忙 编辑: 列表中的元素是LiveData,因为String来自互联网。所以,列表元素保存着LiveData的对象 fun <T> List<LiveData<T>>.combine
list
。我希望观察此列表,以便每当LiveData
中的String
发生变化时,它都会用此字符串
通知观察者此列表我该怎么做?
我的列表元素是严格的
LiveData
,因此不能简化为String
我知道如何观察
LiveData
,但不知道List
请帮忙 编辑: 列表中的元素是
LiveData
,因为String
来自互联网。所以,列表元素保存着LiveData
的对象
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()
}
}
}
如果要观察
列表
,必须在列表的每个元素上附加一个观察者。列表本身是不可见的,只有它的每个LiveData元素。因此,简单地说:
列表
,成为LiveData
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()
}
}
}
为此,您可以使用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()
}
}
}
所有代码都可以直接转换为Java,此答案中没有使用Kotlin特定的内容。但是,如果每个LiveData都有自己的观察者,那么您已经实现了目标…无论LiveData存储在何处(在您的示例中是列表),它都会通知您如何实现步骤2的更改?我如何附加和跟踪列表中每个项目的每个观察者?您可以观察LiveData,如文档所示。