Glide v4如何加载图片到ImageView且仅重写onLoadFailed()方法?
Glide v4 迁移:仅处理加载失败无需重写
setResource()的解决方案 嗨,我完全懂你迁移到Glide v4时的这个烦恼——就想处理个加载失败的逻辑,却被迫要重写setResource()方法,确实有点冗余没必要。这里有个最贴合你需求的方案:
使用RequestListener监听加载状态
Glide v4提供的RequestListener接口专门用来监听图片请求的成功/失败状态,你只需要实现你关心的onLoadFailed方法,完全不用管Target的setResource()逻辑:
Glide.with(holder.icon.getContext()) .load(imageUrl) .diskCacheStrategy(DiskCacheStrategy.ALL) .centerCrop() .addListener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { // 执行你的失败处理逻辑 Glide.clear(holder.icon); holder.icon.setVisibility(View.GONE); // 返回false表示让Glide继续处理默认的错误行为(比如设置errorDrawable),不需要的话返回true即可 return false; } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { // 成功状态不需要额外处理,返回false让Glide正常显示图片 return false; } }) .into(holder.icon);
进阶:封装通用监听器(复用性更强)
如果多个地方都需要这个“加载失败就隐藏ImageView”的逻辑,可以把监听器封装成一个独立类,避免重复写匿名内部类:
public class HideImageViewOnFailListener implements RequestListener<Drawable> { private final ImageView targetView; public HideImageViewOnFailListener(ImageView targetView) { this.targetView = targetView; } @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { Glide.clear(targetView); targetView.setVisibility(View.GONE); return false; } @Override public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { return false; } }
使用的时候就非常简洁:
Glide.with(holder.icon.getContext()) .load(imageUrl) .diskCacheStrategy(DiskCacheStrategy.ALL) .centerCrop() .addListener(new HideImageViewOnFailListener(holder.icon)) .into(holder.icon);
这个方案完美避开了必须重写setResource()的问题,完全聚焦在你需要的失败处理逻辑上,代码也更干净易维护。
内容的提问来源于stack exchange,提问作者ardevd
相关产品推荐
相关产品推荐

