ImageView
问题描述:图片文件已改变,第二次调用ImageView.setImageURI时无法更新图片
分析:setImageURI方法中对uri进行了缓存,由于第一次加载过了该uri的资源,即使该文件内容改变了,判断中仍然会使用之前加载的。
public void setImageURI(Uri uri) {
if (mResource != 0 ||
(mUri != uri &&
(uri == null || mUri == null || !uri.equals(mUri)))) {
updateDrawable(null);
mResource = 0;
mUri = uri; final int oldWidth = mDrawableWidth;
final int oldHeight = mDrawableHeight; resolveUri(); if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
requestLayout();
}
invalidate();
}
}
解决办法:
1、使用不同的文件名(不同的URI)
2、使用setImageBitmap的方式代替
Bitmap bmp;
try {
bmp = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.fromFile(file));
iv.setImageBitmap(bmp);
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
NetWorkImageView
//Copy the code from Volley's NetworkImageView and change onLayout as below.@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!TextUtils.isEmpty(mUrl)) {
loadImageIfNecessary(true);
}else{
if (mImageContainer != null) {
mImageContainer.cancelRequest();
mImageContainer = null;
}
}
}//Change the other ImageView image setters, for example...
@Override
public void setImageDrawable(Drawable drawable) {
mUrl = null;
super.setImageDrawable(drawable);
}@Override
public void setImageURI(Uri uri) {
mUrl = null;
super.setImageURI(uri);
}
Reference:http://kalkanotel.com/networkimageview-set-image-from-file-i225690.htm