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

如何为RecyclerView设置OnClickListener以跳转至另一个Activity

RecyclerView列表项点击跳转Activity实现方案

问题描述

我是Android开发新手,已经用Room数据库加载数据到RecyclerView里了,现在想实现点击任意列表项跳转到另一个Activity,求帮忙。

现有代码

MainActivity中RecyclerView加载代码

private fun setUpListOfDataIntoRecyclerView(registerList:ArrayList<registerEntity>,
                                            registerDao: registerDao){

    if(registerList.isNotEmpty()){
        var itemAdapter = MainAdapter(registerList)
        
        binding?.rvHappyPlaceList?.layoutManager = LinearLayoutManager(this)
        binding?.rvHappyPlaceList?.adapter = itemAdapter
        binding?.rvHappyPlaceList?.visibility = View.VISIBLE
        binding?.noRecordText?.visibility = View.GONE
    }else{
        binding?.rvHappyPlaceList?.visibility = View.GONE
        binding?.noRecordText?.visibility = View.VISIBLE
    }
}

MainAdapter代码

class MainAdapter(val items: ArrayList<registerEntity>):
    RecyclerView.Adapter<MainAdapter.MainHolder>() {

    //step 2
    private var onClickListener: AdapterView.OnItemClickListener? = null

    inner class MainHolder(var binding: ItemHappyPlaceBinding): RecyclerView.
                           ViewHolder(binding.root) {
                                val llTitle = binding.tvTitle
                                 val llDescription = binding.tvDescription
                                  var llImage = binding.ivPlaceImage
                         }

    fun setOnClickListener(onClickListener: View.OnContextClickListener){
        this.onClickListener = onClickListener
    }



    override fun onBindViewHolder(holder: MainHolder, position: Int) {
        val item = items[position]
        holder.llTitle.text = item.title
        holder.llDescription.text = item.description
        holder.llImage.setImageURI(Uri.parse(item.image))
    }
}

实现步骤

1. 修正Adapter中的点击监听逻辑

替换原有的错误监听定义,给列表项根布局绑定点击事件:

class MainAdapter(val items: ArrayList<registerEntity>):
    RecyclerView.Adapter<MainAdapter.MainHolder>() {

    // 定义点击回调,直接返回点击的实体数据
    private var onItemClickListener: ((registerEntity) -> Unit)? = null

    inner class MainHolder(var binding: ItemHappyPlaceBinding): RecyclerView.ViewHolder(binding.root) {
        val llTitle = binding.tvTitle
        val llDescription = binding.tvDescription
        var llImage = binding.ivPlaceImage
    }

    // 设置点击监听的方法
    fun setOnItemClickListener(listener: (registerEntity) -> Unit) {
        this.onItemClickListener = listener
    }

    override fun onBindViewHolder(holder: MainHolder, position: Int) {
        val item = items[position]
        holder.llTitle.text = item.title
        holder.llDescription.text = item.description
        holder.llImage.setImageURI(Uri.parse(item.image))

        // 给列表项根布局绑定点击事件
        holder.itemView.setOnClickListener {
            onItemClickListener?.invoke(item)
        }
    }

    // 补充缺失的getItemCount方法
    override fun getItemCount(): Int {
        return items.size
    }

    // 补充缺失的onCreateViewHolder方法
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainHolder {
        val binding = ItemHappyPlaceBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return MainHolder(binding)
    }
}

2. 在MainActivity中绑定监听并启动Activity

修改setUpListOfDataIntoRecyclerView方法,给Adapter设置点击回调并启动目标Activity:

private fun setUpListOfDataIntoRecyclerView(registerList:ArrayList<registerEntity>,
                                            registerDao: registerDao){

    if(registerList.isNotEmpty()){
        val itemAdapter = MainAdapter(registerList)
        
        // 设置点击监听,启动目标Activity
        itemAdapter.setOnItemClickListener { clickedItem ->
            val intent = Intent(this, DetailActivity::class.java)
            // 传递点击的实体数据(需确保registerEntity实现Parcelable)
            intent.putExtra("SELECTED_ITEM", clickedItem)
            startActivity(intent)
        }
        
        binding?.rvHappyPlaceList?.layoutManager = LinearLayoutManager(this)
        binding?.rvHappyPlaceList?.adapter = itemAdapter
        binding?.rvHappyPlaceList?.visibility = View.VISIBLE
        binding?.noRecordText?.visibility = View.GONE
    }else{
        binding?.rvHappyPlaceList?.visibility = View.GONE
        binding?.noRecordText?.visibility = View.VISIBLE
    }
}

3. 让实体类支持数据传递(可选)

如果需要把点击的实体数据传到目标Activity,让registerEntity实现Parcelable接口:

@Entity(tableName = "register_table")
data class registerEntity(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val title: String,
    val description: String,
    val image: String
): Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readInt(),
        parcel.readString() ?: "",
        parcel.readString() ?: "",
        parcel.readString() ?: ""
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(title)
        parcel.writeString(description)
        parcel.writeString(image)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<registerEntity> {
        override fun createFromParcel(parcel: Parcel): registerEntity {
            return registerEntity(parcel)
        }

        override fun newArray(size: Int): Array<registerEntity?> {
            return arrayOfNulls(size)
        }
    }
}

4. 在目标Activity接收数据(可选)

在DetailActivity中获取传递的实体数据并更新UI:

class DetailActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityDetailBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val selectedItem = intent.getParcelableExtra<registerEntity>("SELECTED_ITEM")
        selectedItem?.let {
            binding.tvDetailTitle.text = it.title
            binding.tvDetailDesc.text = it.description
            binding.ivDetailImage.setImageURI(Uri.parse(it.image))
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:15:47