我具有以下功能:
override fun insertUpdatedItems(items: List<AutomobileEntity>) {
if (!items.isEmpty()) {
items.forEachIndexed { index, automobileEntity ->
if (automobileEntity.id == items[index].id) {
automobileCollection[index] = items[index]
notifyItemInserted(index)
}
}
}
}
我一直在为recyclerview提供数据,我试图插入已在automobileCollection
中的已更新/编辑过的项目,其大小始终会返回10
个项目,但items
列表可能与1
到10
不同。
本来应该按id
比较项目,但是我当前使用此功能得到的是已编辑的项目只是插入到recyclerview的适配器中,而不被视为已经存在的项目。
相反,如果我使用automobileCollection
进行迭代,则会得到IndexOutOfBoundsException,因为在大多数情况下,items
列表小于automobileCollection
。
答案 0 :(得分:2)
要使用另一个列表中的项目更新列表,可以使用几种方法。
首先从直接替换开始(保留订单,但这只是一个细节):
val sourceList = TODO()
val targetList = TODO()
targetList.replaceAll { targetItem ->
sourceList.firstOrNull { targetItem.id == it.id }
?: targetItem
}
或者删除所有项目,然后再次添加它们:
targetList.removeIf { targetItem ->
sourceList.any { it.id == targetItem.id }
}
targetList.addAll(sourceList)
使用listIterator(注意!当您致电replaceAll
时,实际上也确实在幕后发生……不是以相同的方式,而是类似的;-)):
val iterator = targetList.listIterator()
while (iterator.hasNext()) {
iterator.next().apply {
sourceList.firstOrNull { id == it.id }?.also(iterator::set)
}
}
可能不太可读...对于您的forEachIndexed
,我看不到任何用例。对于其他问题肯定有,但是我建议您尝试尽可能地省略索引(以及forEach
)。如果您没有更好的想法,那么forEach
也是可以的,但是很多时候forEach
(甚至更多forEachIndexed
)都不是解决问题的最佳方法。 / p>