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对象
- 在
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 // 其他视图绑定逻辑... }
- 在
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存储位置,再从列表取对应数据
- 在
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 // 其他视图绑定逻辑... }
- 在
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
相关产品推荐
相关产品推荐

