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);
}

 

标签:

未经允许不得转载:作者:SheaYang, 转载或复制请以 超链接形式 并注明出处 技术狗|博客
原文地址:《Android listview 异步加载图片错位》 发布于2019-10-16

分享到:
赞(0)

评论 抢沙发

9 + 2 =


Android listview 异步加载图片错位

长按图片转发给朋友

Vieu4.0主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录