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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:12:36