如何通过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
相关产品推荐
相关产品推荐

