MutableList clear()和addAll()的行为异常

时间:2019-06-19 06:30:39

标签: java android kotlin baseadapter

基本上,我正在BaseAdapter内部使用一种方法来刷新它。它实际上可用于许多功能,但是,一旦我尝试实现一个新功能并使用其自定义方法对其进行刷新,它便清除了控件MutableList。我通过该方法传递的控件MutableList和MutableList是相同的,但是我非常怀疑Kotlin是否会继续引用那么深的内容。因此,我最终将日志放置到各处,然后发现,.clear()调用甚至清除了我经过的MutableList。在通过MutableList本身之前,甚至尝试过对其进行初始化,因此没有任何形式的引用。 因此,我想问的是,是否通常使用.clear()方法,或者实际上是否应有的方法。

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:2)

“该方法所传递的MutableList控件和MutableList控件是相同的,但是我非常怀疑Kotlin是否会继续引用那么深的内容。”

它确实使参考保持了很深的深度。引用将始终指向实例,无论它在程序中的什么位置。

如果您不想影响输入列表。然后,您应该复制列表内容。

我假设您有执行此行的方法。

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 :(得分:2)

不要难,只需使用此代码并放手

fun updateData(list :MutableList<MarketOffer>){
    this.itemsListAdapter = list
    this.notifyDataSetChanged()
}

答案 2 :(得分:1)

适配器内的数据列表是原始数据的参考。 因此,如果清除它,则意味着清除原始列表。

如果您不希望这样做,可以尝试创建listOriginallistDisplay来分别操作它们。并且请记住不要直接使用listDisplay = listOriginal,这会使它们再次拥有相同的引用。