RecyclerView Adapter中点击Item获取位置返回-1的原因
RecyclerView点击事件获取position返回-1的原因及解决办法
原因
你在onCreateViewHolder方法中直接给ImageView设置点击事件,此时ViewHolder还未被RecyclerView绑定到列表的具体位置,RecyclerView用-1表示未绑定有效位置,所以absoluteAdapterPosition、bindingAdapterPosition、layoutPosition这些方法都会返回-1。
解决方案
方案1:在onBindViewHolder中设置点击事件
onBindViewHolder是RecyclerView将ViewHolder与具体列表项绑定的回调,此时参数里的position就是当前项的有效位置,直接使用即可:
override fun onBindViewHolder(holder: ViewHolder, position: Int) { val fruit = fruitList[position] holder.fruitImage.setImageResource(fruit.imageId) holder.fruitName.text = fruit.name holder.fruitImage.setOnClickListener { Log.e("a", position.toString()) // 也可以通过holder获取位置,此时已绑定有效位置 // val currentPos = holder.absoluteAdapterPosition // Log.e("a", currentPos.toString()) } }
方案2:在ViewHolder的初始化块中设置点击事件(推荐)
把点击事件逻辑封装在ViewHolder内部,但要先判断位置是否有效,避免未绑定或已回收的情况:
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val fruitImage: ImageView = view.findViewById(R.id.fruitImage) val fruitName: TextView = view.findViewById(R.id.fruitName) init { fruitImage.setOnClickListener { val position = absoluteAdapterPosition // 先判断位置是否有效,再处理逻辑 if (position != RecyclerView.NO_POSITION) { Log.e("a", position.toString()) val targetFruit = fruitList[position] // 这里写你的点击处理逻辑 } } } }
补充说明
- 不要在
onCreateViewHolder中设置依赖于position的点击事件,因为此时ViewHolder还没被分配到具体的列表位置。 RecyclerView.NO_POSITION就是-1,用常量判断更具可读性。
内容的提问来源于stack exchange,提问作者Weird_dog
相关产品推荐
相关产品推荐

