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

RecyclerView Adapter内Glide加载图片报getActivity为null错误如何解决

问题根因

你遇到的报错核心原因是:Adapter中传入Glide的上下文ct来自已销毁的Fragment。点击保存后你调用了popBackStack()将当前Fragment销毁回收,但此时RecyclerView可能还有未完成的条目绑定任务,此时Fragment已经和Activity解绑,你传入的上下文已经无效,Glide校验不通过就抛出该异常。

最优解决方案

直接修改Adapter中Glide的调用方式,不要传入外部的Context对象,改为传入目标ImageView实例即可,无需额外校验:

@Override
public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {
    Uri uri = Uri.parse(rems.get(position).getImages());
    // 把原来的Glide.with(ct)替换为传入ImageView实例
    Glide.with(holder.binding.imageView)
            .load(new File(uri.getPath()))
            .into(holder.binding.imageView);

    holder.binding.textrow.setText(rems.get(position).getTextRem());
    holder.binding.daterow.setText(rems.get(position).getDateRem());
    holder.binding.isdone.setChecked(rems.get(position).isDone());
}

该方案的优势:

  • Glide会自动感知View的附着状态:如果ImageView还没attach到Window、或者所属页面已经销毁,Glide会自动跳过加载不会抛出异常
  • 自动关联页面生命周期,页面销毁时会自动取消未完成的图片加载请求,避免内存泄漏
备选兜底方案

如果因为特殊原因不能用上述方案,可以增加两层校验避免崩溃:

  1. 在宿主Fragment的onDestroyView生命周期中,清空Adapter数据并通知刷新,避免销毁后还执行条目绑定:
@Override
public void onDestroyView() {
    super.onDestroyView();
    reminderAdapter.setData(Collections.emptyList());
    reminderAdapter.notifyDataSetChanged();
}
  1. 在onBindViewHolder中先判断上下文有效性再加载图片:
@Override
public void onBindViewHolder(@NonNull reminderViewHolder holder, int position) {
    Uri uri = Uri.parse(rems.get(position).getImages());
    if (ct != null && !(ct instanceof Activity 
            && ((Activity) ct).isFinishing() 
            && ((Activity) ct).isDestroyed())) {
        Glide.with(ct).load(new File(uri.getPath())).into(holder.binding.imageView);
    }
    // 其他绑定逻辑不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:15:03