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

时间:2017-10-13 10:17:20

标签: android kotlin

每当有新元素添加到我的列表中时,我想更新我的文本。 我尝试通过下面的代码来做到这一点..

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

但它似乎没有用......有什么想法吗?

3 个答案:

答案 0 :(得分:6)

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

或者,您可以使用标准列表(而不是可变列表),并且每当您需要更改列表时,请将其替换为新版本的列表。通过这种方式,您可以按照自己的意愿收听更改,但可能需要使用该列表调整许多其他代码。

答案 1 :(得分:3)

您可以使用类似这样的内容:

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
    }
}

答案 2 :(得分:1)

我对此很迟,但是已经开发了一个提供可观察的集合的库。

目前,它包括以下集合:

列表
ArrayList
链表
堆栈
向量

地图
ArrayMap
ConcurrentHashMap
LinkedHashMap
TreeMap
WeakHashMap

队列
ArrayBlockingQueue
ArrayDeque
DelayDeque
LinkedBlockingQueue
LinkedTransferQueue
PriorityBlockingQueue
队列
SynchronousQueue

设置
哈希集
LinkedHashSet
树集

将在时间允许的情况下并根据请求添加更多内容。

您可以在以下位置找到它 https://github.com/theblitz/ObservableCollections

,可用于jcenter()上的gradle,如下所示:

  

实现'il.co.theblitz:observablecollections:1.2.0'