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

Android RecyclerView中getAdapterPosition()点击事件异常求助

问题原因与解决方案

核心问题:RecyclerView的ViewHolder复用机制导致点击监听混乱

RecyclerView会复用滑出屏幕的ViewHolder来加载新列表项。你的代码仅给position=0的项设置点击监听,但未给其他位置的项清除已绑定的点击监听。当原本属于第0项的ViewHolder被复用到第7项时,该ViewHolder上的点击监听会被保留,就出现了第7项能点击、第0项反而无法点击的情况——新的第0项可能复用了之前非0位置的ViewHolder,而你没给它设置点击监听。

另外,onBindViewHolder方法参数里的position就是当前绑定项的准确位置,没必要再调用holder.getAdapterPosition(),后者在绑定阶段反而不如参数position可靠。

修复代码

修改onBindViewHolder中的点击监听逻辑,先重置所有item的点击状态,再给第0项设置点击事件:

@Override
public void onBindViewHolder(@NonNull ReportAdapter.ViewHolder holder, int position) {
    // 原有数据绑定代码保持不变...

    // 先重置所有item的点击监听,避免复用导致的混乱
    holder.itemView.setOnClickListener(null);
    
    // 仅给第0项设置点击事件
    if (position == 0){
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DataReturn dataReturn = list.get(position); // 直接用参数position,更安全
                String id = dataReturn.getFromNumber();
                Toast.makeText(context, id, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

额外优化建议

如果后续需要给多个位置设置点击逻辑,建议将点击监听抽成独立方法或使用接口回调的方式处理,避免在onBindViewHolder中重复创建匿名内部类,提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:08:27