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

如何使用holder.getAdapterPosition修复RecyclerView onBindViewHolder位置警告

问题原因

Do not treat position as fixed; only use immediately and call holder.getAdapterPosition() to look it up later
官方警告含义:不要将position视为固定值,仅可即时使用,后续需要查询位置时请调用holder.getAdapterPosition()

onBindViewHolder 方法传入的position参数仅在当前绑定视图的瞬间有效,你在点击事件回调里引用的position属于异步调用,此时item的位置可能已经因为列表增删、排序发生变化,直接用旧position会取到错误数据,甚至触发数组越界异常。

修改方案

把点击事件内部所有用到外部position的地方,替换为holder.getAdapterPosition(),同时增加边界判断,避免holder已经脱离RecyclerView时(返回值为-1,对应常量RecyclerView.NO_POSITION)的异常情况。

修改后完整代码
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    //13---getting data from our arrays
    holder.book_id_txt.setText(String.valueOf(book_id.get(position)));
    holder.book_title_txt.setText(String.valueOf(book_title.get(position)));
    holder.book_author_txt.setText(String.valueOf(book_author.get(position)));
    holder.book_pages_txt.setText(String.valueOf(book_pages.get(position)));

    holder.mainLinearLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // 点击时实时获取当前最新的位置
            int currentPosition = holder.getAdapterPosition();
            // 边界判断,避免无效位置触发异常
            if (currentPosition == RecyclerView.NO_POSITION) {
                return;
            }
            Intent intent = new Intent(context, UpdateActivity.class);
            // transferring data inside activity
            intent.putExtra("id", String.valueOf(book_id.get(currentPosition)));
            intent.putExtra("title", String.valueOf(book_title.get(currentPosition)));
            intent.putExtra("author", String.valueOf(book_author.get(currentPosition)));
            intent.putExtra("pages", String.valueOf(book_pages.get(currentPosition)));
            context.startActivity(intent);
        }
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:06:03