Android列表中用Glide加载图片

最近做项目时遇到一个问题,当列表中有图片时,滑动会出现错乱,原因主要是ItemView的复用导致的,解决方法往往是将imageUrl设为imageView的Tag,然后在绑定视图时通过比较imageView.getTag()和当前的imageUrl是否一致来判断是否需要重新加载图片。
以前使用UIL库是通过设置ImageLoadingListener在onLoadingComplete中进行比较,但现在使用的Glide库,这个库的加载比较简单,直接通过into(imageView)就将图片设置进去了,后来研究了一下,发现into里面可以不直接传imageView,而是传一个Target,里面同样有加载完成等回调。
这里总结了一个设置列表里面图片的方法,可以支持gif和非gif图片,在加载失败时显示指定的图片,还可以根据需要设置是否调整ImageView的尺寸大小以适应图片大小,以及可以设置ImageView的最大宽度。具体实现如下:

/**
 * 加载列表里面的图片,解决复用时图片错乱的问题
 *
 * @param context
 * @param imageView
 * @param url
 * @param defaultImageId
 * @param adjustSize     是否需要调整ImageView的尺寸适应图片大小
 * @param maxImageWidth  最大的ImageView的宽度,只有在adjustSize为true时才有效
 */
public static void setListImage(Context context, final ImageView imageView, final String url, final int defaultImageId, final boolean adjustSize, final int maxImageWidth) {
    boolean isGif = url.endsWith(".gif");
    if (isGif) {
        Glide.with(context).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).error(defaultImageId).into(new SimpleTarget<GifDrawable>() {
            @Override
            public void onResourceReady(GifDrawable resource, GlideAnimation<? super GifDrawable> glideAnimation) {
                if (resource == null || TextUtils.equals(url, (String) imageView.getTag())) {
                    return;
                }
                imageView.setTag(url);
                if (adjustSize) {
                    ViewGroup.LayoutParams params = imageView.getLayoutParams();
                    params.width = Math.min(resource.getIntrinsicWidth(), maxImageWidth);
                    params.height = params.width * resource.getIntrinsicHeight() / resource.getIntrinsicWidth();
                }
                imageView.setImageDrawable(resource);
                resource.start();
            }

            @Override
            public void onLoadFailed(Exception e, Drawable errorDrawable) {
                if (errorDrawable == null) {
                    return;
                }
                imageView.setTag(null);
                if (adjustSize) {
                    ViewGroup.LayoutParams params = imageView.getLayoutParams();
                    params.width = Math.min(errorDrawable.getIntrinsicWidth(), maxImageWidth);
                    params.height = params.width * errorDrawable.getIntrinsicHeight() / errorDrawable.getIntrinsicWidth();
                }
                imageView.setImageDrawable(errorDrawable);
            }
        });
    } else {
        Glide.with(context).load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).error(defaultImageId).into(new SimpleTarget<GlideDrawable>() {
            @Override
            public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
                if (resource == null || TextUtils.equals(url, (String) imageView.getTag())) {
                    return;
                }
                imageView.setTag(url);
                if (adjustSize) {
                    ViewGroup.LayoutParams params = imageView.getLayoutParams();
                    params.width = Math.min(resource.getIntrinsicWidth(), maxImageWidth);
                    params.height = params.width * resource.getIntrinsicHeight() / resource.getIntrinsicWidth();
                }
                imageView.setImageDrawable(resource);
            }

            @Override
            public void onLoadFailed(Exception e, Drawable errorDrawable) {
                if (errorDrawable == null) {
                    return;
                }
                imageView.setTag(null);
                if (adjustSize) {
                    ViewGroup.LayoutParams params = imageView.getLayoutParams();
                    params.width = Math.min(errorDrawable.getIntrinsicWidth(), maxImageWidth);
                    params.height = params.width * errorDrawable.getIntrinsicHeight() / errorDrawable.getIntrinsicWidth();
                }
                imageView.setImageDrawable(errorDrawable);
            }
        });
    }
}

推荐阅读更多精彩内容

  • 一、简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫Glide的图片加载库,作者是bumptech。这...
    天天大保建阅读 4,105评论 2 26
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 131,913评论 20 560
  • 导入Picasso和Glide都在jcenter上。在项目中添加依赖非常简单:Picassodependencie...
    瀚海江天阅读 1,141评论 0 2
  • 一直都想开始写作,却一直拿不出勇气。昨天自己想了很多,即使别人不看,那也得开始写给自己,把这些文章作为自己的一个回...
    真峥阅读 115评论 3 5
  • 杨绛先生回忆钱钟书读书时说到,因为大学在图书馆时养成的习惯,也因为战乱颠沛流离,所以呢,他们家里没有多少书,都是读...
    香树维拉阅读 17评论 0 0