如何最优传递ArrayList<Card>数据至ProductActivity并展示?
RecyclerView点击卡片跳转并传递Card数据的最优实现方法
1. 让Card类实现Parcelable接口
Android中传递自定义对象最高效的方式是用Parcelable,直接让你的data class实现这个接口,Android Studio可以自动生成Parcelable的实现代码(右键Generate -> Parcelable),修改后的代码如下:
import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize data class Card( val id: Long, val category: String, val company: String, val name: String, val cost: Int, val photo: String ) : Parcelable
注:如果用的是kotlin-parcelize插件,需要在app的build.gradle里添加依赖:
id 'kotlin-parcelize',这样@Parcelize注解就能自动生成Parcelable的实现代码,不用手动编写序列化相关方法。
2. 给RecyclerView的Item添加点击回调
在RecyclerView的Adapter里定义点击回调接口,解耦点击事件的处理逻辑:
class CardAdapter(private val cardList: List<Card>) : RecyclerView.Adapter<CardAdapter.CardViewHolder>() { // 定义点击回调接口 interface OnItemClickListener { fun onItemClick(card: Card) } private var listener: OnItemClickListener? = null // 暴露设置监听的方法 fun setOnItemClickListener(listener: OnItemClickListener) { this.listener = listener } inner class CardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { // 绑定视图控件,比如TextView、ImageView等 fun bind(card: Card) { // 这里做视图绑定,例如 itemView.tv_name.text = card.name // ... // 给itemView设置点击事件 itemView.setOnClickListener { listener?.onItemClick(card) } } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_card, parent, false) return CardViewHolder(view) } override fun onBindViewHolder(holder: CardViewHolder, position: Int) { holder.bind(cardList[position]) } override fun getItemCount() = cardList.size }
3. 在宿主页面处理点击跳转
比如在MainActivity中,给Adapter设置点击监听,创建Intent传递Card对象:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) recyclerView.layoutManager = LinearLayoutManager(this) val cardAdapter = CardAdapter(cardList) // cardList是你的ArrayList<Card>实例 // 设置点击监听 cardAdapter.setOnItemClickListener { card -> // 创建Intent跳转至ProductActivity val intent = Intent(this, ProductActivity::class.java) // 传递Card对象 intent.putExtra("EXTRA_CARD", card) startActivity(intent) } recyclerView.adapter = cardAdapter } }
4. 在ProductActivity中接收并展示数据
class ProductActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_product) // 获取传递的Card对象 val card = intent.getParcelableExtra<Card>("EXTRA_CARD") card?.let { // 把数据展示到视图上,例如: findViewById<TextView>(R.id.tv_id).text = it.id.toString() findViewById<TextView>(R.id.tv_category).text = it.category findViewById<TextView>(R.id.tv_company).text = it.company findViewById<TextView>(R.id.tv_name).text = it.name findViewById<TextView>(R.id.tv_cost).text = it.cost.toString() // 如果需要加载图片,可以用Glide等库加载it.photo // Glide.with(this).load(it.photo).into(findViewById(R.id.iv_photo)) } } }
为什么这是最优实现?
- Parcelable比Serializable更高效:Serializable依赖反射,性能损耗大;Parcelable是Android原生序列化方案,更适合移动端场景。
- 接口回调解耦:点击事件逻辑不在Adapter中处理,交给宿主页面,符合单一职责原则,代码更易维护。
- 代码简洁:借助kotlin-parcelize插件自动生成序列化代码,减少手动编写的错误,整体逻辑清晰。
内容的提问来源于stack exchange,提问作者Xelloeuy
相关产品推荐
相关产品推荐

