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

如何通过Intent在Activity间传递CartModels列表?代码抛ClassCastException求解决

问题原因分析

你遇到的ClassCastException是因为数据传递时的类型完全不匹配:

  • 在MainActivity中,你把每个CartModels对象转成了ArrayList<Any>(包含Int和String类型),然后将整个列表强转为ArrayList<String>——这是错误的,因为列表中的元素是ArrayList而非String。
  • 到了InvoiceActivity中,getStringArrayListExtra()期望获取的是ArrayList<String>,但实际收到的是ArrayList<ArrayList<Any>>,遍历的时候把ArrayList当成String处理,直接触发类型转换异常。
正确解决方案(推荐Parcelable)

Android中传递自定义对象列表,最规范高效的方式是让数据类实现Parcelable接口:

1. 修改CartModels实现Parcelable

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

@Parcelize
data class CartModels (
    val id: Int,
    val title: String,
    val price: Int,
    val qty: Int,
    val subTotal: Int
) : Parcelable

注意:需要在app模块的build.gradle中添加kotlin-parcelize插件:

plugins {
    // 保留原有插件,添加以下行
    id 'kotlin-parcelize'
}

2. MainActivity中传递数据

// 定义常量(建议放在类顶部)
const val TAG_CART_DATA = "cart_data"

btnCheckout.setOnClickListener {
    Log.d("MainActivity:::::", "onViewCreated: ${viewModel.cart}")
    val intent = Intent(requireActivity(), InvoiceActivity::class.java)
    // 直接传递Parcelable列表,无需手动拆转
    intent.putParcelableArrayListExtra(TAG_CART_DATA, ArrayList(viewModel.cart))
    startActivity(intent)
}

3. InvoiceActivity中接收数据

val listCart = intent.getParcelableArrayListExtra<CartModels>(TAG_CART_DATA)

mAdapter.submitList(listCart)
binding.rvCart.apply {
    adapter = mAdapter
    layoutManager = LinearLayoutManager(this@InvoiceActivity)
    setHasFixedSize(true)
}
替代方案(Serializable,更简单但效率稍低)

如果不想添加插件,也可以用Serializable接口:

1. 修改CartModels实现Serializable

import java.io.Serializable

data class CartModels (
    val id: Int,
    val title: String,
    val price: Int,
    val qty: Int,
    val subTotal: Int
) : Serializable

2. MainActivity传递数据

const val TAG_CART_DATA = "cart_data"

btnCheckout.setOnClickListener {
    Log.d("MainActivity:::::", "onViewCreated: ${viewModel.cart}")
    val intent = Intent(requireActivity(), InvoiceActivity::class.java)
    intent.putExtra(TAG_CART_DATA, ArrayList(viewModel.cart))
    startActivity(intent)
}

3. InvoiceActivity接收数据

val listCart = intent.getSerializableExtra(TAG_CART_DATA) as? ArrayList<CartModels>

mAdapter.submitList(listCart)
binding.rvCart.apply {
    adapter = mAdapter
    layoutManager = LinearLayoutManager(this@InvoiceActivity)
    setHasFixedSize(true)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:55:32