ImageView
问题描述:图片文件已改变,第二次调用ImageView.setImageURI时无法更新图片
分析:setImageURI方法中对uri进行了缓存,由于第一次加载过了该uri的资源,即使该文件内容改变了,判断中仍然会使用之前加载的。
1 public void setImageURI(Uri uri) { 2 if (mResource != 0 || 3 (mUri != uri && 4 (uri == null || mUri == null || !uri.equals(mUri)))) { 5 updateDrawable(null); 6 mResource = 0; 7 mUri = uri; 8 9 final int oldWidth = mDrawableWidth;10 final int oldHeight = mDrawableHeight;11 12 resolveUri();13 14 if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {15 requestLayout();16 }17 invalidate();18 }19 }
解决办法:
1、使用不同的文件名(不同的URI)
2、使用setImageBitmap的方式代替
1 Bitmap bmp;2 try {3 bmp = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.fromFile(file));4 iv.setImageBitmap(bmp); 5 } catch (FileNotFoundException e) {6 } catch (IOException e) {7 }
NetWorkImageView
//Copy the code from Volley's NetworkImageView and change onLayout as below.@Overrideprotected 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...@Overridepublic void setImageDrawable(Drawable drawable) { mUrl = null; super.setImageDrawable(drawable);}@Overridepublic void setImageURI(Uri uri) { mUrl = null; super.setImageURI(uri);}
Reference:http://kalkanotel.com/networkimageview-set-image-from-file-i225690.htm