如何在kotlin中创建一个可观察的列表

Aud*_*udi 3 android kotlin

我希望每当有一个新元素添加到我的列表时更新我的​​文本..我试图通过下面的代码来做到这一点..

var myList: MutableList<ArrayList<String>> by Delegates.observable(mutableListOf(), onChange = { _, _, new ->
    Constants.debug("Value Changed")
})
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用..任何想法?

Rob*_*bin 6

它不起作用,因为observabe委托只观察变量的变化,而不观察存储在变量中的对象.因此,当列表更改时,变量仍指向相同的列表,并且可观察的委托不知道有任何更改.要观察这一点,你需要一些实际观察列表内容的方法,这不是Kotlin或Java提供的开箱即用的东西.你需要某种可观察的清单.

或者,您可以使用标准列表(而不是可变列表),并且每当您需要更改列表时,请将其替换为新版本的列表.这样您就可以像想要的那样收听更改,但可能需要使用该列表调整许多其他代码.

  • 有点晚了,但您可以将 Collection 实现包装在自定义类中并覆盖 get/remove 方法。这样你就可以触发你的听众。 (2认同)

avi*_*ney 5

你可以使用这样的东西:

class ObservableList<T>(private val wrapped: MutableList<T>): MutableList<T> by wrapped, Observable() {
    override fun add(element: T): Boolean {
        if (wrapped.add(element)) {
            setChanged()
            notifyObservers()
            return true
        }
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)