You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Android开发:如何将商品详情页数据添加到订单详情页的ListView中

解决方案

你现有代码的核心问题是商品详情页的点击事件逻辑写反了:你当前是从新创建的空Intent中提取数据,而没有把当前页面的商品数据写入Intent传递给订单页。按以下步骤修改即可实现需求:

步骤1:改造epedidos数据类支持序列化

要在Activity之间传递自定义对象,需要让数据类实现Parcelable接口,Kotlin可以直接用@Parcelize注解简化实现:
首先在app模块的build.gradle(或build.gradle.kts)中添加parcelize插件:

// groovy格式build.gradle示例
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-parcelize' // 新增这行
}

然后修改epedidos类:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class epedidos (
    var cod_producto: String,
    var nom_producto: String,
    var cantidad_producto : Int,
    var total_apagar : Float
) : Parcelable

步骤2:修改商品详情页的点击事件逻辑

把当前页面的商品数据封装后传入Intent,再跳转订单页:

override fun onClick(p0: View?) {
    when (p0?.id) {
        R.id.imgNuevoPedido -> {
            // 1. 先获取当前页面显示的商品数据
            val codProducto = findViewById<TextView>(R.id.txtdetcodproducto).text.toString()
            val nomProducto = findViewById<TextView>(R.id.txtdetnomproducto).text.toString()
            val precioProducto = findViewById<TextView>(R.id.txtdetprecioproduct).text.toString().toFloat()
            // 可自定义默认购买数量,这里默认1件
            val cantidad = 1
            val total = cantidad * precioProducto

            // 2. 封装成epedidos对象
            val productoSeleccionado = epedidos(
                cod_producto = codProducto,
                nom_producto = nomProducto,
                cantidad_producto = cantidad,
                total_apagar = total
            )

            // 3. 把对象放入Intent
            val intent = Intent(this@DetalleProducto, DetallePedido::class.java)
            intent.putExtra("producto_seleccionado", productoSeleccionado)

            // 4. 跳转订单页
            startActivity(intent)
        }
    }
}

步骤3:在订单详情页(DetallePedido)接收数据并更新列表

首先在DetallePedido类中定义全局的列表和适配器变量:

class DetallePedido : AppCompatActivity() {
    // 存储订单商品的列表
    private val pedidoList = arrayListOf<epedidos>()
    // 适配器实例
    private lateinit var adapter: ListAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_detalle_pedido) // 替换为你自己的订单页布局id

        // 1. 初始化ListView和适配器
        val listView = findViewById<ListView>(R.id.id_tu_listview) // 替换为你自己的ListView控件id
        adapter = ListAdapter(this, R.layout.item_pedido, pedidoList) // 第二个参数替换为你自己的列表项布局id
        listView.adapter = adapter

        // 2. 接收从商品详情页传过来的数据
        if (intent.hasExtra("producto_seleccionado")) {
            val producto = intent.getParcelableExtra<epedidos>("producto_seleccionado")
            producto?.let {
                // 3. 把商品添加到列表,刷新适配器
                pedidoList.add(it)
                adapter.notifyDataSetChanged()
            }
        }
    }
}

扩展说明

如果你需要多次从不同商品详情页添加商品到同一个订单列表,可以把订单页的启动模式设置为singleTop,或者改用Activity Result API的方式回传数据,避免每次跳转都创建新的订单页实例。

内容的提问来源于stack exchange,提问作者kenny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:06:04