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

