Android convertView,使用与否?

时间:2014-04-29 21:53:43

标签: android listview android-listview

在Android Developer Blog的文章Multithreading For Performance中,convertView中使用了Adapter.getItem()来显示ImageView的列表,这些列表是通过HttpRequest.Yet下载的,我也是查看一些不使用convertView的Android教程,只需在Adapter.getItem()中填充新视图。

我想知道使用convertView的优势是什么?它如何回收使用过的视图?使用的视图缓存在哪里?

我问这个问题是因为我在项目中没有使用convertView而且我想知道不使用它的成本。下面是我对图像列表视图的实现。

我没有使用convertView,而是在Adapter.getItem()中展开新视图。此外,我创建了一个包装类来保存listView的每个项目中的工作人员。下载图像后,它将作为位图存储在每个列表项的包装类中(图像很小)。这样,我可以避免重复下载同一图像。这也避免了Multithreading For Performance中谈到的竞争条件问题。但我还是有点担心,使用我的方法有什么问题不好吗?


仅供参考:@Carl Anderson推荐的文章详细介绍了convertView在适配器中的工作原理。本文中建议的Romain Guy的Google IO是另一个很好的参考。

总之,使用convertView可以优化空间和时间。此外,我已经放弃了我自己的imageDownloader并使用了@CommonsWare推荐的Picasso。它就像一个魅力。

4 个答案:

答案 0 :(得分:7)

不重复使用convertView的问题在于,正如您所说的那样,每当用户将一行滚动到视图中时,您就会创建并展开新的View。与重用现有视图相比,创建和扩充视图需要花费大量时间,而且您肯定会为其带来性能损失。

我的应用程序做了类似的事情 - 它在ListView中的行内部使用ImageViews,并且这些ImageViews由在后台下载的图像填充。作为我对线程错误的调查的一部分,我关闭了视图的重用,当我这样做时,性能非常糟糕。 ListView代码针对视图重用进行了优化,如果您不遵守,则会降低帧速率和可用性。

阅读此链接还有助于我更好地了解ListView的工作方式: http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

答案 1 :(得分:2)

  

我也看到一些不使用convertView的Android教程,只是在Adapter.getItem()中膨胀一个新视图。

这不是一个好兆头。

  

我想知道使用convertView有什么好处?

它节省了CPU时间并在堆中产生更少的垃圾。

  

如何回收使用过的视图?

使用过的视图。

  

使用过的视图缓存在哪里?

AdapterView

  

我问这个问题是因为我没有在我的项目中使用convertView而且我想知道不使用它的成本。

那么,根据您编写适配器的方式,您可能会从超类中“免费”获得行回收。

  

下面是我对图像列表视图的实现。

您的问题中没有代码。

  

我没有使用convertView,而是在Adapter.getItem()中扩展了一个新视图。

仅在convertViewnull时执行此操作。否则,请使用convertView。这需要一个if/else构造。

  

下载图像后,它将作为位图存储在每个列表项的包装类中(图像很小)。通过这种方式,我可以避免重复下载相同的图像。

我不太明白你在哪里/如何下载图像。有很多很多库都是为你做的,使用一个通常比滚动你自己的代码更好。我喜欢PicassoIon,但还有其他人。

  

但是我仍然有点担心,使用我的方法有什么问题不好吗?

可能比我列出的更多,但没有看到任何代码,很难猜出可能不好的东西。

答案 2 :(得分:1)

convertView项目只是一个帮助器视图,虽然它是一个非常重要的视图,可以帮助您创建更少的视图。

与常规视图创建相比,ConvertView是一种与图像下载相关的优化。在Android中膨胀视图是一项昂贵的操作,如果您的列表包含许多项目,特别是可以放在一个屏幕上的更多项目,则设备必须创建几个几乎相同的视图来填充listView。

相反,当您使用convertView时,您可以帮助系统创建更少的视图,因为它使您能够重用系统已创建但用户不可见的视图,因此您只需更改其内容而不是创建每个项目的新视图。

滚动列表视图时,不使用convertView是延迟的常见原因

答案 3 :(得分:0)

以最基本的方式使用convertView只是为了回收视图而不是每次需要视图时创建新视图,因此如果您的列表视图永远不会丢失视图,您可能不需要实现它,例如大约3-4的简短列表视图观点。但这是一个很好的做法检查this谷歌I / O演示文稿