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
相关产品推荐
相关产品推荐

