今天在写一个图片加载类ImageLoader,在使用的时候想用Glide替代我写的ImageLoader,然后问题就出来了!!!
第一个问题:在使用自己写的ImageLoader的时候,为了防止item复用导致的图片错乱,设置了Tag 如下代码
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.image_list_item,parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ImageView imageView = holder.imageView;
final String tag = (String)imageView.getTag();
final String uri = getItem(position);
if (!uri.equals(tag)) {
imageView.setImageDrawable(mDefaultBitmapDrawable);
}
if (mIsGridViewIdle && mCanGetBitmapFromNetWork) {
imageView.setTag(uri);
mImageLoader.bindBitmap(uri, imageView, mImageWidth, mImageWidth);
}
return convertView;
}
使用setTag(object),这里使用了每个图片的url地址来作为Tag来防止图片错乱
当使用Glide来替换ImageLoader,代码如下:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_gridview, parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ImageView imageView = holder.imageView;
final String tag = (String) imageView.getTag();
final String uri = getItem(position);
if (!uri.equals(tag)) {
imageView.setImageDrawable(mDefaultBitmapDrawable);
}
if (mIsGridViewIdle && mCanGetBitmapFromNetWork) {
imageView.setTag(uri);
Glide.with(getApplicationContext()).load(uri).placeholder(R.drawable.image_default).crossFade().into(imageView);
//mImageLoader.bindBitmap(uri, imageView, mImageWidth, mImageWidth);
}
return convertView;
}
运行结果报错:java.lang.IllegalArgumentException: You must not call setTag() on a view Glide is targeting
然后将imageView设置Tag的代码删除,程序正常运行 。
但这个时候哟与出现一个问题,那就是图片错乱了。
第二个问题:删除ImageView的Tag的时候 图片错乱
解决问题的方法:使用setTag(int,object)方法设置tag 这样就解决了上面两个问题
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_gridview, parent, false);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.image);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ImageView imageView = holder.imageView;
final String tag = (String) imageView.getTag(R.id.imageloader_uri);
final String uri = getItem(position);
if (!uri.equals(tag)) {
imageView.setImageDrawable(mDefaultBitmapDrawable);
}
if (mIsGridViewIdle && mCanGetBitmapFromNetWork) {
imageView.setTag(R.id.imageloader_uri,uri);
Glide.with(getApplicationContext()).load(uri).placeholder(R.drawable.image_default).crossFade().into(imageView);
//mImageLoader.bindBitmap(uri, imageView, mImageWidth, mImageWidth);
}
return convertView;
}
这里的R.id.imageloader_uri是values下新建的ids.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="imageloader_uri" type="id"/>
</resources>

本文介绍了在使用Glide图片加载库时遇到的两个问题:一是从自定义ImageLoader切换到Glide时,由于设置Tag导致的错误;二是删除ImageView Tag后引发的图片错位。解决方案是改用setTag(int, object)方法来设置Tag,避免图片错乱。"
137916953,23012796,SpringBoot整合百度OCR:实战文字识别,"['Spring Boot', 'OCR', '百度API']

3344

被折叠的 条评论
为什么被折叠?



