使用MutableList时,Delegates.observable()不会收到通知

时间:2018-03-01 18:42:59

标签: android kotlin

我尝试使用Delegates.observable(),以便在MutableList发生更改时收到通知。

val items: MutableList<Item> by Delegates.observable(startingItems) {
        _, old, new ->
        Log.e("observable", "${old.size}  -> ${new.size}")
    }

但是每当我尝试删除或添加某些内容时,都不会发生任何事情。我的意思是Logcat中没有日志的痕迹,因为它应该在那里。

2 个答案:

答案 0 :(得分:2)

docs州:

  

<强>可观察

     

Delegates.observable()有两个参数:初始值和修改处理程序。 每次分配属性时都会调用处理程序(执行赋值后)。它有三个参数:分配给的属性,旧值和新值。

在您的情况下,您没有分配到items,您只需添加到现有实例。回调永远不会被调用。

建议:使用只读List的mutable属性,并在添加新元素时重新分配:

var items: List<String> by Delegates.observable(mutableListOf()) { _, old, new ->
    println("changed")
}

//add like this:
user.items += "new val"

plus运算符不会在列表中调用add,而是创建一个包含所有旧元素和新元素的新实例。

答案 1 :(得分:0)

我找到了这个问题的答案,实际上'cuz Delegates.observable()只观察变量的变化,而不观察变量中存储的对象。