在编写多图片上传时,遇到一个很郁闷的问题,就是在gridview中添加一个“+”项,经常会被后面添加的图片覆盖,变成两个图片一模一样。后面才发现,Gridview的Adapter会重复使用item项目来提高效率,这样当重新刷新时,每个item会被重新使用,但一次刷新时,一个position会一直使用一个item。
由于这个特性,当异步加载图片时,异步加载的图片还未完成,这样一个相同的item可能就会出现不是你想要的图片(原因就是你的item换成一个新的图片,而这个换的动作比上次用这个item去异步加载图片的快,因此即使这次换成功了,也会被异步加载成功的图片替换)。
简单说:就是一个item换两次图片时,哪个加载快就会被加载慢的图片覆盖。
那如何解决呢?
很简单,每个换图片时,将图片的路径设置在item的tag上,每次真正换图片时(调用setImageBitmap),判断此时的tag值和你换的最新图片的path是否一致,一致时才替换。
加上代码:
public class BitmapCache { public static void display(final ImageView iv, final String thumbPath, final String sourcePath, final int reqWidth, final int reqHeight) { if (TextUtils.isEmpty(thumbPath) && TextUtils.isEmpty(sourcePath)) { return; } final String path; if (!TextUtils.isEmpty(thumbPath)) { path = thumbPath; } else if (!TextUtils.isEmpty(sourcePath)) { path = sourcePath; } else { return; } if (iv.getTag() != null && iv.getTag().toString().equals(path)) { return; } iv.setTag(path); Bitmap bitmap = GlobalContext.getInstance().getBitmapCache().get(path + reqWidth + reqHeight); if (bitmap != null) { iv.setImageBitmap(bitmap); return; } iv.setImageBitmap(null); new MyAsyncTask<Void, Bitmap, Bitmap>() { //todo //when I finish new ImageView in the future, I will refactor these code.... @Override protected Bitmap doInBackground(Void... params) { Bitmap bitmap = null; try { bitmap = ImageUtility .decodeBitmapFromSDCard(path, reqWidth, reqHeight); } catch (OutOfMemoryError ignored) { } return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if (bitmap != null) { // 判断 tag是否和最新的路径一致 if (path.equals(iv.getTag())) { iv.setImageBitmap(bitmap); } GlobalContext.getInstance().getBitmapCache().put(path + reqWidth + reqHeight, bitmap); } } }.executeOnExecutor(MyAsyncTask.THREAD_POOL_EXECUTOR); } }
重点在这:
if (iv.getTag() != null && iv.getTag().toString().equals(path)) { return; } iv.setTag(path);
和这:
if (path.equals(iv.getTag())) { iv.setImageBitmap(bitmap); }
相关推荐
利用viewPage+fragment+GridView 实现 页面滑动,点击GridView的item控制父类控件
一个activity里面嵌套了fragment,fragment里面含有多张page,一个page里面又包含多个gridview,gridview实现动态加载
Android 滑动效果 Gallery + GridView
Android项目ActivityGroup + GridView + ViewFlipper 实现选项卡 本项目是一个基于Android平台的应用程序,它实现了选项卡功能。通过结合ActivityGroup、GridView和ViewFlipper组件,我们能够创建一个流畅、直观的...
ActivityGroup + GridView + ViewFlipper 实现选项卡源代码.zip ActivityGroup + GridView + ViewFlipper 实现选项卡源代码.zip ActivityGroup + GridView + ViewFlipper 实现选项卡源代码.zip ActivityGroup + ...
滑屏及界面刷新(ViewPager+GridView)
android 自定义gridView 按日期显示图片和视频 galleryDemo android 自定义gridView 按日期显示图片和视频 galleryDemo android 自定义gridView 按日期显示图片和视频 galleryDemo 免费下载 给个好评!
安卓自定义PoPUpWidow:弹窗中含有viewpager+gridView.
Fragment+ViewPager+GridView最佳实践,可以看看这篇博文~ http://blog.csdn.net/jxq1994/article/details/52984062
Jquery+GridViewJquery+GridViewJquery+GridViewJquery+GridViewJquery+GridView asp.net 3.5 asp.net 3.5 asp.net 3.5 asp.net 3.5
本Demo演示了Spinner+ListView+GridView分别采用BaseAdapter填充内容 【简单易懂,含全注释】 注:创建版本为Android4.4.2
Android ScrollView+GridView左右滑动 创建时自动定位滑动到某一项以及点击按钮准确定位到某一项,附带源码,非常适合初学者。
AndroidStudio代码。在MyApplication建立全局realm数据库,gridviewItem点击更新数据,重载或重新进入App时显示最后更新的数据!
读者也许会马上想到使用TabHost 与 TabActivity的组合,其实最常用的不是它们,而是由GridView与ActivityGroup的组合。每当用户在GridView选中一项,ActivityGroup就把该项对应的Activity的Window作为View添加到...
Android自定义复杂表格+GridView+ RecyclerView,比较适合我们进行多列表的排序。能够进行多列表布局,类型不规则的九宫格模式
模仿美团大众点评 首页 分类导航的实现
安卓Android源码——ActivityGroup + GridView + ViewFlipper 实现选项卡.rar
ViewFlipper + Gridview 实现网格视图由上向下自动滑动效果
android_登录_注册+gridview分页
ViewPager+GridView实现宫格横向分页滑动切换