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

Android RecyclerView列表项ID/位置如何传递至其他类?

如何将RecyclerView中视图元素的ID(位置)传递到另一个类?

当前点击RecyclerView的元素时,仅能传递最后生成元素的ID,代码如下:

class CardAdapter : RecyclerView.Adapter<CardAdapter.CardViewHolder>(), View.OnClickListener {
private var cardList = ArrayList<Card>()
private lateinit var card: Card

class CardViewHolder(
    val binding: FragmentCardBinding
) : RecyclerView.ViewHolder(binding.root)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
    val inflater = LayoutInflater.from(parent.context)
    val binding = FragmentCardBinding.inflate(inflater, parent, false)
    return CardViewHolder(binding)
}

@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
    card = cardList[position]
    ..
}

override fun getItemCount(): Int = cardList.size

override fun onClick(v: View) {
    when (v.id) {
        R.id.root_card_template -> {
            val intent = Intent(v.context, ProductActivity::class.java)
            // need put id into ProductActivty
            intent.putExtra("item", card.id)
            v.context.startActivity(intent)

        }
    }
}

问题原因

你使用了全局的card变量存储当前绑定的数据,每次执行onBindViewHolder时都会覆盖这个变量的值,最终点击时它只会保留最后一次绑定的元素数据,因此只能传递最后一个元素的ID。

解决方案

方案1:通过View的Tag存储当前Card对象

  1. 在onBindViewHolder中,给点击视图设置监听并存入当前Card对象:
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
    val card = cardList[position]
    // 给根布局绑定点击监听
    holder.binding.rootCardTemplate.setOnClickListener(this)
    // 将当前Card对象存入View的Tag
    holder.binding.rootCardTemplate.tag = card
    // 其他视图绑定逻辑...
}
  1. 在onClick方法中,从Tag取出Card对象并获取ID:
override fun onClick(v: View) {
    when (v.id) {
        R.id.root_card_template -> {
            val clickedCard = v.tag as Card
            val intent = Intent(v.context, ProductActivity::class.java)
            intent.putExtra("item", clickedCard.id)
            v.context.startActivity(intent)
        }
    }
}

方案2:通过View的Tag存储位置,再从列表取对应数据

  1. 在onBindViewHolder中,存入当前元素的位置:
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
    val card = cardList[position]
    holder.binding.rootCardTemplate.setOnClickListener(this)
    // 将当前位置存入View的Tag
    holder.binding.rootCardTemplate.tag = position
    // 其他视图绑定逻辑...
}
  1. 在onClick方法中,通过位置获取对应Card对象:
override fun onClick(v: View) {
    when (v.id) {
        R.id.root_card_template -> {
            val position = v.tag as Int
            val clickedCard = cardList[position]
            val intent = Intent(v.context, ProductActivity::class.java)
            intent.putExtra("item", clickedCard.id)
            v.context.startActivity(intent)
        }
    }
}

额外注意

记得移除全局的private lateinit var card: Card变量,避免后续逻辑出现数据混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:00:46