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

如何在RecyclerView中获取指定位置View?滚动后View为空怎么解决

问题原因

RecyclerView的复用机制会自动回收屏幕不可见区域的Item View,findViewByPosition仅能获取到当前可视区域的View,不可见的Item View会返回null,直接操作Item View的思路不符合RecyclerView的设计规范,必然会出现空指针问题。

解决方案(适配Data Binding场景)

核心逻辑:所有UI状态要和数据源绑定,修改UI前先修改数据源,由Adapter驱动UI刷新,不要直接操作Item View。

1. 扩展数据源实体类

给列表Item对应的实体类新增控制ImageView可见性的布尔字段,默认值为false(对应GONE状态)。

public class ItemBean {
    // 原有其他业务字段
    private boolean isShowImageView;

    public boolean isShowImageView() {
        return isShowImageView;
    }

    public void setShowImageView(boolean showImageView) {
        isShowImageView = showImageView;
    }
}

2. 结合Data Binding在XML中绑定可见性逻辑

在Item布局的XML中,直接通过Data Binding表达式关联ImageView的可见性和实体类的状态字段,无需在代码中手动设置可见性。

<!-- 布局头部导入View类 -->
<data>
    <import type="android.view.View" />
    <variable
        name="itemBean"
        type="你的包名路径.ItemBean" />
</data>

<!-- 对应ImageView控件 -->
<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="@{itemBean.showImageView ? View.VISIBLE : View.GONE}" />

3. 修改点击事件逻辑

点击时不要直接修改ImageView的可见性,改为修改对应位置数据源的状态,通知Adapter刷新对应Item即可。

public void onClickImageView(int position) {
    // 改数据源状态
    dataList.get(position).setShowImageView(true);
    positionArrayList.add(position);
    // 通知刷新对应位置
    notifyItemChanged(position);
}

同时调整Adapter的onBindViewHolder绑定逻辑:

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    ItemBean bean = dataList.get(position);
    holder.binding.setItemBean(bean);
    holder.binding.executePendingBindings();
}

4. 调整重置逻辑

重置时无需获取Item View,直接修改对应位置数据源的状态,通知Adapter刷新即可,完全规避View为空的问题。

@Override
public void resetImageViewToDefault(ArrayList<Integer> positionArrayList) {
    for (Integer pos : positionArrayList) {
        // 增加边界判断防止下标越界
        if (pos >= 0 && pos < adapter.getDataList().size()) {
            adapter.getDataList().get(pos).setShowImageView(false);
            adapter.notifyItemChanged(pos);
        }
    }
    // 重置完成后清空位置列表
    positionArrayList.clear();
}
额外优化建议
  • 可以不用单独维护positionArrayList,重置时直接遍历数据源把所有isShowImageView设为false再通知刷新即可,逻辑更简洁。
  • 单个位置刷新用notifyItemChanged比全局notifyDataSetChanged性能更好,也不会触发RecyclerView的滚动跳动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 20:18:03