изменение дочернего объекта списка в kotlin, но список равен неизмененному - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть такой класс данных

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

И я создаю mutableList этого

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, и хотя список такой же, как и в старом списке, адаптер не поймет, что я должен что-то изменить.

Как мне добиться того, что я хотеть? спасибо за ваш ответ

1 Ответ

1 голос
/ 15 апреля 2020

В этом случае вы также изменяете классы данных исходного списка. Поэтому, если вы распечатаете оба списка, вы получите одинаковые результаты:

список: [TestModel (id = 1, предложение = test, isPlaying = true), TestModel (id = 2, предложение = test2, isPlaying = false), TestModel (id = 3, предложение = test3, isPlaying = false)]

list2: [TestModel (id = 1, предложение = test, isPlaying = true), TestModel (id = 2, предложение = 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)

Надеюсь, это поможет!

...