Kotlin中实现RecyclerView条目点击跳转对应独立Activity的方法
RecyclerView条目点击跳转对应独立Activity实现方案
步骤1:扩展ItemsViewModel类
给ItemsViewModel新增字段,存储当前条目对应的目标Activity类,明确每个条目的跳转目标:
// 扩展后的ItemsViewModel data class ItemsViewModel( val image: Int, val text: String, val targetActivity: Class<*> // 新增:绑定对应Activity的Class对象 )
步骤2:修改RecyclerView页面代码(recyclerView.kt)
填充数据时,为每个条目指定对应的Activity(需提前创建好目标Activity并在Manifest中注册):
class RecyclerViewActivity : AppCompatActivity() { // 类名首字母大写,符合Kotlin编码规范 private lateinit var binding: ActivityRecyclerViewBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityRecyclerViewBinding.inflate(layoutInflater) setContentView(binding.root) supportActionBar?.hide() // 设置垂直布局管理器 binding.recyclerview.layoutManager = LinearLayoutManager(this) // 填充数据,绑定每个条目对应的Activity val data = ArrayList<ItemsViewModel>() data.add(ItemsViewModel(R.drawable.jumping_jack, "开合跳", JumpingJackActivity::class.java)) data.add(ItemsViewModel(R.drawable.jumping_aquats, "跳跃深蹲", JumpingSquatActivity::class.java)) // 绑定适配器到RecyclerView val adapter = CustomAdapter(data) binding.recyclerview.adapter = adapter } }
步骤3:修改适配器的点击事件逻辑(CustomAdapter.kt)
在条目点击事件中,通过ItemsViewModel存储的Activity类启动对应页面:
class CustomAdapter(private val mList: List<ItemsViewModel>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.card_view_design, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = mList[position] holder.imageView.setImageResource(item.image) holder.textView.text = item.text // 条目点击跳转逻辑 holder.itemView.setOnClickListener { val context = holder.itemView.context val intent = Intent(context, item.targetActivity) context.startActivity(intent) } } override fun getItemCount(): Int { return mList.size } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val imageView: ImageView = itemView.findViewById(R.id.imageview) val textView: TextView = itemView.findViewById(R.id.textView) } }
推荐:解耦式写法(避免适配器依赖Activity)
如果想让适配器更通用,可通过Lambda回调将点击事件抛给Activity处理:
1. 修改适配器构造,添加回调参数
class CustomAdapter( private val mList: List<ItemsViewModel>, private val onItemClick: (ItemsViewModel) -> Unit // 点击回调Lambda ) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() { // onCreateViewHolder、getItemCount、ViewHolder代码不变 override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = mList[position] holder.imageView.setImageResource(item.image) holder.textView.text = item.text holder.itemView.setOnClickListener { onItemClick(item) // 触发回调 } } }
2. 在Activity中处理跳转
class RecyclerViewActivity : AppCompatActivity() { // 初始化代码不变 override fun onCreate(savedInstanceState: Bundle?) { // ...其他逻辑不变 val adapter = CustomAdapter(data) { item -> // 在Activity中处理跳转逻辑 startActivity(Intent(this, item.targetActivity)) } binding.recyclerview.adapter = adapter } }
内容的提问来源于stack exchange,提问作者cmsvs
相关产品推荐
相关产品推荐

