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

