在编写多图片上传时,遇到一个很郁闷的问题,就是在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); }
相关推荐
- 适当使用内存缓存:对于大图,可以使用LruCache或其他图片缓存库,减少内存消耗。 - 调整GridView的滚动性能:设置`smoothScrollbar=true`,使滚动更平滑;还可以通过`setFastScrollEnabled(true)`启用快速滚动...
6. **注意事项** - **处理空页面**:当数据为空或加载失败时,应有适当的提示。 - **错误重试机制**:加载失败后,提供重试功能,允许用户重新加载数据。 通过以上步骤,我们可以实现一个高效且用户体验良好的...
4. 注意事项: - 优化性能:避免在`getView()`方法中进行耗时操作,如图片加载,可以使用像Picasso或Glide这样的库来异步加载和缓存图片。 - 动态加载:初始加载少量数据,后续根据用户滚动情况动态加载,防止一次...
在Android开发中,GridView是一种常用的布局控件,它允许我们以网格的形式展示数据,通常用于创建像图片墙、菜单或联系人列表等界面。当数据量较大时,为了提高用户体验和减少内存消耗,我们需要实现GridView的分页...
#### 五、注意事项 1. **性能优化**:使用`ViewHolder`模式来缓存视图,减少频繁创建视图带来的性能开销。 2. **资源回收**:确保在不再需要图片资源时及时释放,防止内存泄漏。 3. **自适应屏幕**:考虑不同屏幕...
通过上述步骤和注意事项,我们可以成功地创建一个可以左右滚动的gridview,用于展示照片或其他横向数据。在实际应用中,还可以根据需求添加更多的交互效果,如滑动监听、手势识别等,以增强用户体验。
3. 图片缓存:可能实现了内存和磁盘的双层缓存机制,以加快图片加载速度并减少网络请求。 4. 图片占位符:为了提升用户体验,可能会在图片加载前显示一个占位符,避免空白区域。 5. 加载失败处理:包含错误重试...
这种方式能够提供多维度的数据展现,比如在一个商品列表中,每个商品的图片、名称和价格可能都需要在一个单独的单元格中显示,此时就可以用到ListView嵌套GridView。 **ListView嵌套GridView的基本原理:** 在...
七、优化与注意事项 1. 考虑性能优化:对于大量图片,可以使用懒加载策略,只加载当前屏幕可见的图片。 2. 图片压缩:在上传图片前,可以对选中的图片进行压缩,减少网络传输的负担。 3. 用户体验:提供取消选择功能...
4. **注意事项** - 性能影响:虽然JazzyListView做了优化,但过多的动画可能会影响性能,尤其是对于内存有限的设备,应适度使用动画。 - 兼容性问题:部分动画可能在一些旧版本的Android系统上无法正常工作,因此...
在Android开发过程中,为了防止因加载大量图片而导致应用程序出现内存溢出(OutOfMemoryError),通常会采用LRUCache(Least Recently Used Cache)来管理图片缓存。这种方式能够有效地减少内存消耗,提高应用性能。...
5. 注意事项: - 记得在使用完InputStream后关闭它,以避免内存泄漏和资源浪费。 - 对于大量图片,考虑使用内存缓存和异步加载策略,如LruCache和AsyncTask,以提高性能和用户体验。 - 如果遇到图片无法显示的...
7. `JavaApk源码说明.txt`: 可能包含了项目源码的简要说明,包括如何使用、注意事项以及可能存在的问题。 8. `下载更多打包源码~.url`: 一个链接,可能指向更多的Android开发资源或者相关项目的下载地址。 在实际...
7. 注意事项:在处理数据和更新视图时,确保UI线程不会阻塞,避免ANR(Application Not Responding)错误。可以使用AsyncTask或其他异步处理机制来加载数据。 总的来说,通过合理地结合ListView和GridView,开发者...
4. 注意事项: - 在适配器中,确保正确地设置了GridView和Gallery的数据源,以及正确地绑定数据到每个View。 - 考虑性能优化,避免一次性加载过多图片导致内存消耗过大。可以使用图片加载库,如Glide或Picasso,来...
10. **readme.md** 文件: 这个文件通常包含项目介绍、安装指南、使用方法和注意事项,对于理解和使用源码至关重要。 通过分析上述知识点,开发者可以学习到如何在Android应用中实现一个高效、美观且用户友好的相册...
在提供的压缩包中,“无标题.png”可能是展示图片浏览效果的示例,“源码说明.txt”可能包含了源码的使用说明和注意事项,“双击访问白杨工作室查看更多程序源码~.url”指向一个网址,可能提供了更多源码资源,...
以上是创建Android画廊应用的一些核心技术和注意事项。通过结合这些技术,我们可以构建出一个功能强大且视觉上引人入胜的画廊应用。在实际开发中,"MyGallery"可能是一个包含所有这些实现的项目,包含了必要的布局...
在提供的压缩包中,`教程重要说明.txt`可能是实现`Gallery 3D`效果的步骤和注意事项,而`GalleryFlow`可能是实现这一效果的一个示例项目。通过分析这个项目源代码,你可以学习到如何结合上述知识点来创建自定义的3D...
《Android照片墙应用实现Demo详解》 在移动应用开发领域,Android平台因其开源特性与丰富的功能,...同时,readme.txt文件可能提供了更多关于项目背景、使用方法和注意事项的信息,是进一步理解项目的重要参考资料。