如何解决我用另一个对象创建了一个对象,但是在所有arraylist中都修改了一个属性
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) }
)
}
}
//...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。