Android convertView,使用与否?

Android convertView,使用与否?,android,listview,android-listview,Android,Listview,Android Listview,在Android开发者博客的文章中,convertView在Adapter.getItem()中使用,以显示通过HttpRequest下载的ImageView列表。然而,我也看到一些Android教程没有使用convertView,只是在Adapter.getItem()中膨胀了一个新视图 我想知道使用convertView有什么好处?它如何回收使用过的视图?使用的视图缓存在哪里 我问这个问题是因为我没有在我的项目中使用convertView,我想知道不使用它的成本。下面是我对图像列表视图的实现

在Android开发者博客的文章中,
convertView
Adapter.getItem()
中使用,以显示通过HttpRequest下载的
ImageView
列表。然而,我也看到一些Android教程没有使用
convertView
,只是在
Adapter.getItem()中膨胀了一个新视图

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

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

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


仅供参考:@Carl Anderson推荐的文章详细介绍了convertView在适配器中的工作方式。本文中提出的Romain Guy的GoogleIO是另一个很好的参考

总之,使用convertView可以优化空间和时间。此外,我放弃了自己的imageDownloader,使用了@Commonware推荐的毕加索。它就像一个符咒

我还看到一些Android教程没有使用convertView,只是在Adapter.getItem()中膨胀了一个新视图

这不是一个好迹象

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

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

它如何回收使用过的视图

这是使用过的视图

使用的视图缓存在哪里

AdapterView

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

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

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

你的问题中没有代码

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

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

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

我不太明白你在哪里/如何下载图像。有许许多多的库可以为您实现这一点,使用一个库通常比滚动您自己的代码更好。我喜欢这样,但还有其他的

但我还是有点担心,用我的方法有什么不好的地方吗


可能不止我列出的内容,但是如果没有看到任何代码,很难猜测哪些内容可能不好。

不重新使用
convertView
的问题是,正如您所说,每次用户将一行滚动到视图中时,您都在创建和扩展一个新的
视图。与重用现有视图相比,创建和扩展视图需要花费大量的时间,而且您肯定为此付出了性能上的代价

我的应用程序也做了类似的事情——它在ListView的行中使用ImageView,这些ImageView由在后台下载的图像填充。作为对线程错误调查的一部分,我关闭了视图的重用,当我这样做时,性能绝对糟糕。ListView代码是为视图重用而优化的,如果您不坚持这一点,您的帧速率和可用性将受到影响

阅读此链接还帮助我更好地了解ListView的工作原理:

convertView项只是一个帮助器视图,尽管它非常重要,但可以帮助您创建更少的视图

ConvertView是一种优化,它与图像下载的关系小于与常规视图创建的关系。在android中增加视图是一项昂贵的操作,如果您的列表中有许多项,尤其是一个屏幕上可以容纳的更多项,那么设备将不得不创建几个几乎相同的视图来填充您的列表视图

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


滚动列表视图时,不使用convertView是导致延迟的常见原因。使用convertView最基本的方法是循环使用视图,而不是在每次需要视图时创建新视图。因此,如果您的列表视图从未丢失视图,您可能不需要实现它,例如大约3-4个视图的简短列表视图。但检查谷歌I/o演示文稿是一个很好的做法