观察java中的实时数据列表

观察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

我有一个liveData列表,比如
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元素
  • 决定要对每个观察到的元素执行的操作
  • 我知道如何观察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,如文档所示。