我是kotlin的新手,我想更新列表中的项目。 我使用这段代码:
var index: Int
for (record in recordList)
if (record.id == updatedHeader?.id) {
index = recordList.indexOf(record)
recordList.add(index, updatedHeader)
}
但由于ConcurrentModificationException
答案 0 :(得分:2)
假设recordList
是MutableList
和val
(因此,您希望修改记录),可以使用forEachIndexed
查找您关心的记录并替换它们。
这不会导致ConcurrentModificationException
:
recordList.forEachIndexed { index, record ->
if(record.id == updatedHeader?.id) recordList[index] = updatedHeader
}
另一方面,如果您将recordList
重新定义为非可变列表和var,则可以使用map
重写整个列表:
recordList = recordList.map { if(it.id == updatedHeader?.id) updatedHeader else it }
当然,如果您想将.toMutableList()
变成List
,可以在结束时致电MutableList
。
答案 1 :(得分:0)
如果列表中包含给定id
的单个记录,您可以找到其索引并在该索引处添加标题:
val index = recordList.indexOfFirst { it.id == updatedHeader.id }
if (index >= 0)
recordList.add(index, updatedHeader)
如果有多个具有给定ID的记录,并且您希望在每个记录之前添加标头,则可以使用get listIterator
并使用其方法在迭代期间修改列表而不获取ConcurrentModificationException
:
val iterator = recordList.listIterator()
for (record in iterator) {
if (record.id == updatedHeader.id) {
iterator.previous() // move to the position before the record
iterator.add(updatedHeader) // prepend header
iterator.next() // move next, back to the record
}
}