我试图在数组更改其内容时收到通知。 通过此代码,我可以通知数组的设置,但是在插入新项目时什么也没发生。
var array: MutableMap<String, List<String>> = mutableMapOf()
set(value) {
field = value
arrayListener?.notify()
}
我唯一想到的就是每次添加,删除或编辑项目时都将数组重置为其自身,例如:
array = array
我阅读了有关Javascript的问题How to watch for array changes?,但是我想要一个更简单的解决方案,然后创建一个新对象,有人可以建议吗?
答案 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()
}
}