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

Kotlin中RecyclerView条目点击监听:跳转Activity并传递数据

为RecyclerView条目设置点击监听并跳转传值的实现方案

一、简化Adapter的点击回调逻辑

你的Adapter里同时存在两种点击回调方式(接口+lambda),可以简化为单一的lambda回调,更贴合Kotlin的简洁风格。修改后的Adapter代码如下:

// 保留lambda回调,删除冗余的接口相关代码
var onItemClick: ((Contest) -> Unit)? = null

inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val name: TextView = itemView.findViewById(R.id.card_title)
    val time: TextView = itemView.findViewById(R.id.card_time)
    val venue: TextView = itemView.findViewById(R.id.card_venue)
    val team: TextView = itemView.findViewById(R.id.card_team_type)
    val prize: TextView = itemView.findViewById(R.id.card_prize)
    val entry: TextView = itemView.findViewById(R.id.card_entry_division)
    val join_btn: Button = itemView.findViewById(R.id.card_join_btn)

    init {
        // 条目点击时触发lambda,传入当前点击的Contest对象
        itemView.setOnClickListener {
            val position = adapterPosition
            // 避免条目回收后触发无效点击
            if (position != RecyclerView.NO_POSITION) {
                onItemClick?.invoke(contestlist[position])
            }
        }
    }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    val itemView = LayoutInflater.from(parent.context).inflate(R.layout.contest_item, parent, false)
    return MyViewHolder(itemView)
}

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    val contest = contestlist[position]
    // 简化赋值逻辑,直接使用contest变量
    holder.name.text = contest.name
    holder.entry.text = contest.entry
    holder.prize.text = contest.prize
    holder.team.text = contest.team
    holder.time.text = contest.time
    holder.venue.text = contest.venue
    holder.join_btn.text = contest.total_entry
}

二、在宿主Activity中设置点击监听并实现跳转传值

1. 让Contest类支持序列化传递

要通过Intent传递对象,需让Contest类实现Serializable或Parcelable接口,这里以简单的Serializable为例:

data class Contest(
    val name: String,
    val entry: String,
    val prize: String,
    val team: String,
    val time: String,
    val venue: String,
    val total_entry: String
) : Serializable

2. 配置点击回调与跳转逻辑

在RecyclerView所在的Activity中,初始化Adapter后设置onItemClick回调:

class ContestListActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_contest_list)

        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this)
        
        // 替换为你的实际数据源
        val contestList = mutableListOf<Contest>()
        val adapter = YourAdapter(contestList) // 替换成你的Adapter类名
        
        // 设置条目点击监听
        adapter.onItemClick = { contest ->
            // 跳转至详情页Activity
            val intent = Intent(this, ContestDetailActivity::class.java)
            // 传递Contest对象
            intent.putExtra("EXTRA_CONTEST", contest)
            startActivity(intent)
        }
        
        recyclerView.adapter = adapter
    }
}

三、在详情页Activity接收并展示数据

在ContestDetailActivity中获取传递的对象,然后展示详情内容:

class ContestDetailActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_contest_detail)

        // 获取传递的Contest对象
        val contest = intent.getSerializableExtra("EXTRA_CONTEST") as Contest
        
        // 示例:将数据绑定到页面控件
        findViewById<TextView>(R.id.tv_detail_name).text = contest.name
        findViewById<TextView>(R.id.tv_detail_time).text = contest.time
        // 其他字段同理设置
    }
}

补充优化方案

如果追求更高的传输效率,可以改用Parcelable接口,Kotlin可通过@Parcelize注解简化实现:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class Contest(
    val name: String,
    val entry: String,
    val prize: String,
    val team: String,
    val time: String,
    val venue: String,
    val total_entry: String
) : Parcelable

传递时保持intent.putExtra("EXTRA_CONTEST", contest)不变,接收时改为:

val contest = intent.getParcelableExtra<Contest>("EXTRA_CONTEST")

内容的提问来源于stack exchange,提问作者UTSAV THALOR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:40:34