问题描述
for循环中的每件事都工作正常,但是当循环完成时,我不知道为什么更改了属性图片并在所有列表中重复了,您可以在我拍摄的屏幕快照中看到它,实际上我已经没有任何解释,可能是这样,我目前无法解决问题,也许这里有人可以提供帮助。
谢谢。
This is the picture for the Log debugging
binding.updateItem.setonClickListener {
val itemsPending = arraylistof<ItemToShipRequest>()
val picturesRequest = ArrayList<PictureRequest>()
shipment.items!!.forEachIndexed { index,item ->
picturesRequest.clear()
item.picture.forEach { picture ->
picturesRequest.add(PictureRequest(picture.pictureUrl))
}
val y = ItemToShipRequest(
item.titleItem,item.quantityItem,item.unitPrice,item.unitWeight,item.weightUnit,item.category!!.id,item.productLink,picturesRequest,)
itemsPending.add(y)
Log.e(TAG,"itemsPending $index: ${itemsPending[index]}")
Log.i(TAG,"================================================")
}
Log.e(TAG,"itemsPending OUTSIDE LOOP: $itemsPending")}
解决方法
您要将相同的picturesRequest
列表传递给每个ItemToShipRequest
实例,因此它们都共享相同的列表。由于您清除了列表并为内部循环中的每个项目重新填充了列表,因此它们都使用了一个列表,该列表显示了与列表中最后一个项目相对应的信息。
在不需要时避免使用ArrayList / MutableList。当您使用只读列表时,这类错误的可能性较小。
map
函数从另一个列表的内容中创建一个只读列表,因此这是一种转换数据的简洁明了的方法。而run
作用域函数使您可以从内部省略所有item.
。
您的上述代码将变为:
binding.updateItem.setOnClickListener {
val itemsPending = shipment.items!!.map { item ->
item.run {
ItemToShipRequest(
titleItem,quantityItem,unitPrice,unitWeight,weightUnit,category!!.id,productLink,picture.map { PictureRequest(it.pictureUrl) }
)
}
}
//...
}