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
相关产品推荐
相关产品推荐

