文章中Multithreading For Performance来自Android Developer Blog,在Adapter.getItem()
中使用convertView
来显示通过HttpRequest.Yet下载的ImageView
列表,我还看到一些 Android 教程不使用 convertView
,只是在 Adapter.getItem()
中扩充一个新 View 。
我想知道使用 convertView
有什么好处?它如何回收使用过的 View ?使用的 View 缓存在哪里?
我问这个问题是因为我没有在我的项目中使用convertView
,我想知道不使用它的成本。下面是我对图像 ListView 的实现。
我没有使用 convertView
,而是在 Adapter.getItem()
中扩充了一个新 View 。此外,我创建了一个包装类来保存 listView
的每个项目中的员工。下载图像后,它将作为位图存储在每个列表项的包装类中(图像很小)。这样我就可以避免重复下载同一张图片。这也避免了 Multithreading For Performance 中讨论的竞争条件问题。 .但是还是有点担心,用我的方法会不会有什么不好的地方?
仅供引用:@Carl Anderson 推荐的文章详细介绍了 convertView 如何在适配器中工作。本文中推荐的 Romain Guy 的 Google IO 是另一个很好的引用。
总之,使用 convertView 是空间和时间上的优化。此外,我已经放弃了自己的 imageDownloader 并使用@CommonsWare 推荐的 Picasso。它就像一个魅力。
最佳答案
不重复使用 convertView
的问题是,正如您所说,每次用户滚动一行时,您都在创建和膨胀一个新的 View
进入视野。与重用现有 View 相比,创建和扩充 View 需要花费大量时间,而且您肯定会为此付出性能损失。
我的应用程序做了类似的事情 - 它在 ListView 的行内使用 ImageView,这些 ImageView 由在后台下载的图像填充。作为我对线程错误调查的一部分,我关闭了 View 的重用,当我这样做时,性能非常糟糕。 ListView 代码针对 View 重用进行了优化,如果您不坚持这一点,您的帧率和可用性将会受到影响。
阅读此链接还帮助我更好地理解了 ListView 的工作原理: http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/
关于Android convertView,用还是不用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23375997/