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

