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

如何最优传递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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:05:19