微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我用另一个对象创建了一个对象,但是在所有arraylist中都修改了一个属性

如何解决我用另一个对象创建了一个对象,但是在所有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 举报,一经查实,本站将立刻删除。