因为Adapter对View的复用以及图片网络请求的耗时问题有时候在快速滑动且网络不佳的情况下会出现图片加载错乱。
即滑动到屏幕内发出网络请求,但并未请求完成就已滑出屏幕,待到请求完成时,就加载到了其它ItemView上。
常用的做法是将uri设置为ImageView的tag例如:
String title = dataBean.getTitle(); String uri = dataBean.getThumbnail_pic_s(); holder.mImgContentItem.setTag(uri); if(holder.mImgContentItem.getTag()!=null&&uri==holder.mImgContentItem.getTag(){ holder.mImgContentItem.setImageResource(); holder.mTextContentItem.setText(title); } 1 2 3 4 5 6 7
即在加载前将图片uri传递给ImageView,在要展示图片前,将当前请求的uri和ImageView做对比判断,是同一个,才进行加载。
但是当我们使用Glide做图片加载的时候这么设置会出现You must not call setTag() on a view Glide is targeting 错误提示。
此时我们只需要通过setTag(key,object)来进行设置即可:
String title = dataBean.getTitle(); String uri = dataBean.getThumbnail_pic_s(); holder.mImgContentItem.setTag(R.id.imageid,uri); if(holder.mImgContentItem.getTag(R.id.imageid)!=null&&uri==holder.mImgContentItem.getTag(R.id.imageid)){ Glide.with(mContext).load(uri).into(holder.mImgContentItem); holder.mTextContentItem.setText(title); } 1 2 3 4 5 6 7
注意:setTag内第一个参数key,必须是resource资源,只需在res-value内建立一个ids.xml即可,内部代码:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="imageid" type="id"/>
</resources>
1
2
3
4
然后就可以通过R.id进行引用了