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

如何将RecyclerView(ProductActivity)的数据传递到DetailActivity?

实现方案

点击条目传递Firebase对应数据的逻辑很简单,核心是拿到点击位置对应的Product实体,通过Intent传递到详情页后渲染即可,分三步修改代码:

1. 先让Product类支持序列化

Intent只能传递支持序列化的对象,先修改你的Product数据类,实现Serializable接口:

// 注意类定义末尾加 : Serializable,字段保持和你Firebase里的字段完全一致
data class Product(
    val name: String = "",
    val price: String = "",
    val description: String = "",
    val photo: String = ""
) : Serializable

小提示:如果你的Product类还有其他自定义字段,要么也支持序列化,要么标记@Transient注解避免传值报错。

2. 修改列表页点击传值逻辑

在ProductActivity的onItemClick回调里,通过adapter自带的getItem(position)方法拿到当前点击的商品对象,塞入Intent再跳转:

override fun onItemClick(position: Int) {
    Toast.makeText(this, "Item $position clicked", Toast.LENGTH_SHORT).show()
    // 拿到点击位置对应的商品数据
    val selectedProduct = adapter?.getItem(position)
    val intent = Intent(this, DetailActivity::class.java)
    // 传入商品对象,第一个参数是key,取值的时候用相同key即可,建议抽成常量避免写错
    intent.putExtra("EXTRA_PRODUCT", selectedProduct)
    startActivity(intent)
}

3. 详情页接收数据并渲染

在DetailActivity的onCreate生命周期里,从Intent取出传过来的商品对象,绑定到布局控件上:

class DetailActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_detail)

        // 取出传过来的商品对象,做类型转换+判空避免崩溃
        val product = intent.getSerializableExtra("EXTRA_PRODUCT") as? Product
        product?.let {
            // 替换成你自己详情页布局对应的控件ID即可
            val tvName = findViewById<TextView>(R.id.detail_product_name)
            val tvPrice = findViewById<TextView>(R.id.detail_product_price)
            val tvDesc = findViewById<TextView>(R.id.detail_product_desc)
            val ivPhoto = findViewById<ImageView>(R.id.detail_product_image)

            tvName.text = it.name
            tvPrice.text = it.price
            tvDesc.text = it.description
            // 图片加载逻辑和列表页一致,用Glide加载Firebase Storage的图片地址
            val imgRef = FirebaseStorage.getInstance().getReferenceFromUrl(it.photo)
            Glide.with(this).load(imgRef).into(ivPhoto)
        }
    }
}

性能优化可选方案

上面用Serializable写法最简单,适合新手快速实现,如果要更好的传值性能,可以用Android官方推荐的Parcelable,Kotlin里不用手写模板代码,用@Parcelize注解即可:

  • 先在app模块的build.gradle里添加kotlin-parcelize插件:
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    // 加下面这行
    id 'kotlin-parcelize'
}
  • 修改Product类的实现接口:
@Parcelize
data class Product(
    val name: String = "",
    val price: String = "",
    val description: String = "",
    val photo: String = ""
) : Parcelable
  • 传值逻辑不用改,详情页取值换成getParcelableExtra即可:
val product = intent.getParcelableExtra<Product>("EXTRA_PRODUCT")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:36:31