Kotlin手表阵列更换

时间:2018-08-29 07:33:26

标签: arrays kotlin

我试图在数组更改其内容时收到通知。 通过此代码,我可以通知数组的设置,但是在插入新项目时什么也没发生。

var array: MutableMap<String, List<String>> = mutableMapOf()
    set(value) {
        field = value
        arrayListener?.notify()
    }

我唯一想到的就是每次添加,删除或编辑项目时都将数组重置为其自身,例如:

array = array

我阅读了有关Javascript的问题How to watch for array changes?,但是我想要一个更简单的解决方案,然后创建一个新对象,有人可以建议吗?

2 个答案:

答案 0 :(得分:2)

您目前仅观察到将新映射分配给array变量。如果添加了地图项或从地图中删除了地图项,您的代码将不会通知您。

如果要观察是否array被重新分配,则可以使用Kotlin标准库中的Observable委托。

注意:您应该重命名array变量以使其适合您使用的数据结构。

这里是一个例子:

 var map:  MutableMap<String, List<String>> by Delegates.observable(mutableMapOf()) {
    property, oldValue, newValue ->  
    if (oldValue != newValue) //notify that reference has changed
 }

您可以阅读有关可观察的委托人here的信息。

由于您想观察地图中的变化,因此我认为您应该看看this question。这可能会有所帮助。要存档您想要的内容,您必须扩展地图或在其周围创建包装,当添加或删除地图条目时,该通知将通知您。

答案 1 :(得分:2)

Array的API非常简单:元素可以写入那里,也可以从数组中读取。

使用此简单的API时,人们对99%的数组使用率(无理由的数字,请读“绝大多数”)感到满意。如果将具有简单实现的简单界面与棘手的功能混合在一起,那将是一种耻辱。

解决您的问题,一种可能的方法可能是创建数组的包装器

LEFT join

用法示例:

class ArrayWrapper<T> (private val array: Array<out T>, 
                       private val onChange: () -> Unit) {
    val size = array.size

    fun get(index: Int): T {
        return array[index]
    }

    fun set(index: Int, value: T) {
        array[index] = value
        onChange()
    }
}