MutableList clear () и addAll () ведут себя странно - PullRequest
0 голосов
/ 19 июня 2019

В основном я использую метод внутри BaseAdapter, чтобы обновить его.На самом деле это работало для множества функций, однако, как только я попытался реализовать новую и использовал ее собственный метод для ее обновления, он просто очистил управление MutableList.Элементы управления MutableList и MutableList, которые я передаю через метод, одинаковы, однако я сильно сомневаюсь, что Котлин продолжит ссылаться так глубоко.Таким образом, я закончил размещать логи повсюду и выяснить, что вызов .clear() очистил даже MutableList, который я передаю.Попытался даже инициализировать саму MutableList, прежде чем я его передам, так что нет никаких шансов на какую-либо ссылку.Поэтому я думаю, что спрашиваю, обычно ли используется метод .clear() или это не то, что на самом деле должно быть.

enter image description here

enter image description here

Ответы [ 3 ]

2 голосов
/ 19 июня 2019

Не усложняйте, просто используйте этот код и отпустите его

fun updateData(list :MutableList<MarketOffer>){
    this.itemsListAdapter = list
    this.notifyDataSetChanged()
}
2 голосов
/ 19 июня 2019

«Элемент управления MutableList и MutableList, который я передаю через метод, один и тот же, однако я сильно сомневаюсь, что Котлин сохранит ссылку настолько глубокой».

Он действительно сохраняет ссылку такой глубокой.Ссылка всегда будет указывать на экземпляр, независимо от того, где он находится в программе.

Если вы не хотите влиять на список ввода.Затем вы должны скопировать содержимое списка.

Я предполагаю, что у вас есть метод, который выполняет эту строку.

fun setList(list: MutableList<MarketOffer>) {
    this.itemsListAdapter = list // points to the same instance of MutableList
}

Используйте эту строку вместо

fun setList(list: MutableList<MarketOffer>) {
    this.itemsListAdapter = list.toMutableList() // create a new instance of MutableList
}
1 голос
/ 19 июня 2019

Список данных внутри вашего адаптера является ссылкой на ваши исходные данные.Так что если вы очистите его, значит очистите свой исходный список.

Если вы не хотите этого, вы можете попробовать создать listOriginal и listDisplay для управления ими по отдельности.И помните, что не используйте listDisplay = listOriginal напрямую, это заставляет их снова держать тот же реф.

...