【问题标题】:modifying child object of list in kotlin but list is equal to not modifed在kotlin中修改列表的子对象但列表等于未修改
【发布时间】:2020-04-15 09:51:16
【问题描述】:

我有一个这样的数据类

data class TestModel(val id: Int, val sentence: String , var isPlaying: Boolean)

我制作了一个可变列表

val list: MutableList<TestModel> = arrayListOf(
    TestModel(1,"test",false),
    TestModel(2,"test2",false),
    TestModel(3,"test3",false))

然后将列表复制到另一个对象中

val list2=list

当我修改列表时,例如:

list2[0].isPlaying=true

如果我检查这两个列表的相等性

print(list==list2)

修改list中的数据时结果为真

我在 Android ListAdapter 中使用此列表,虽然列表与旧列表相同,但适配器无法理解我已经做了一些修改。

我怎样才能实现我想要的? 感谢您的回复

【问题讨论】:

  • 你想检查哪个类的属性?仅在播放中。
  • 不,我想检查整个列表。事实上我的问题不是检查清单。 android列表适配器在提交新列表时不接受相同的列表,而对象的一个​​属性可能已更改。问题是 list1 等于 list2 而 list2 有一个索引,它的属性之一已更改
  • 这里val list2 = list复制的是引用,而不是列表,list2[0].isPlaying = true之后的变量list[0].isPlaying也将是true,因为它是同一个列表(对象)。并且适配器不会观察到您列表中的变化,您应该使用notifyDataSetChanged()
  • @IR42 没有手动notiftdatasetchange() 就没有办法做到这一点?

标签: android kotlin android-recyclerview listadapter


【解决方案1】:

在这种情况下,您还要修改原始列表的数据类。因此,如果您打印两个列表,您将得到相同的结果:

列表:[TestModel(id=1, sentence=test, isPlaying=true), TestModel(id=2, sentence=test2, isPlaying=false), TestModel(id=3, sentence=test3, isPlaying=false)]

list2: [TestModel(id=1, sentence=test, isPlaying=true), TestModel(id=2, sentence=test2, isPlaying=false), TestModel(id=3, 句子=test3, isPlaying=false)]

您需要复制每个数据类以获得所需的结果,否则您将引用原始列表的相同数据类,并且两者将具有相同的数据

为此,您可以使用此函数来制作这些数据类的副本:

fun MutableList<TestModel>.copyOf(): MutableList<TestModel> {
    return this.map { it.copy() }.toMutableList()
}

并像这样使用它:

val list = mutableListOf(
    TestModel(1,"test",false),
    TestModel(2,"test2",false),
    TestModel(3,"test3",false)
)
val list2=list.copyOf()
list2[0].isPlaying=true
println(list==list2)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多