Android listview 异步加载图片错位

释放双眼,带上耳机,听听看~!

关键代码:

// 给 ImageView 设置一个 tag
holder.imageView.setTag(imgUrl);
// 预设一个图片
holder.imageView.setImageResource(R.drawable.ic_launcher);

// 通过 tag 来防止图片错位
if (imageView.getTag() != null && imageView.getTag().equals(imageUrl)) {
    imageView.setImageBitmap(result);
}

参考案例:

/**
 * 封装好的加载图片框架,可避免图片错乱问题
 * add by 先小涛 on 2018.09.25
 *
 * @param context 上下文
 * @param view 存放图像的视图
 * @param url 加载图片的网络地址,也作为tag
 * @param defaultRes 默认图片
 */
public static void loadImage(Context context, final ImageView view, final String url, 
        final int defaultRes) {
    if (view == null){
        return;
    }
    view.setImageResource(defaultRes);
    if (!TextUtils.isEmpty(url) && context != null) {
        view.setTag(KEY_TAG_IMAGE_URL, imageUrl);
        Imager.with(context).loadImage(url, LoadOptions.with(view).callback(new LoadListener() {
            @Override
            public void onLoadCompleted(View view, ImageInfo imageInfo) {
                if (view != null && imageInfo != null) {
                    Object targetTag = imageView.getTag(KEY_TAG_IMAGE_URL);
                    Bitmap bitmap = imageInfo.getBitmap();
                    if (targetTag != null && !targetTag.equals(tag) && bitmap != null 
                          && !bitmap.isRecycled()) {
                        putImageUrlToTag(view, url);
                        ((ImageView) view).setImageBitmap(bitmap);
                    }
                }
            }
        }));
    }
}

使用Glide:

// 获取图像控件的Tag
String tag = (String) holder.imgView.getTag();     
// 如果不一样,则设置为默认图片  
if (!TextUtils.equals(mDataList.get(position).getUrl(), tag)) {                       
    holder.imgView.setImageResource(R.drawable.ic_launcher); 
} 
// 使用Glide展示图像 
Glide.with(DemoActivity.this)
    .load(mDataList.get(position).getUrl())
    .into(new SimpleTarget<GlideDrawable>() {
        @Override
        public void onResourceReady(GlideDrawable resource, 
                GlideAnimation<? super GlideDrawable> glideAnimation) {
            holder.imgView.setTag(mDataList.get(position).getUrl());                                
            holder.imgView.setImageDrawable(resource);
        }
    });

网友提供的其他思路:holer开始被复用的时候,直接中断请求。

/**
 * 在holder中发起加载请求
 */
@Override
public void onBindViewHolder(Myholder holder, int position) {
    String istrurl = mImgList.get(position).getImageUrl();
    if (null == holder || null == istrurl || istrurl.equals("")) {
        return;
    }
    Glide.with(mContext)
        .load(istrurl)
        .placeholder(R.drawable.ic_launcher_background)
        .into(holder.mImvShow);
}

/**
 * 在view被回收的时候中断请求
 */
@Override
public void onViewRecycled(Myholder holder) {
    if (holder != null) {
        Glide.clear(holder.mImvShow);
    }
    super.onViewRecycled(holder);
}

 

人已赞赏
Android文章

Android中获取Width和Height的几种方式

2019-10-16 16:50:41

Android文章

QMUI_Android状态栏相关

2019-10-17 3:50:44

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索