我有一个ListView,每行包含大约10个ImageButton。其中大多数按钮的可见性为Gone,只在非常罕见的情况下显示。我想知道是否值得用ViewStubs替换这些ImageButton以避免为ListView的所有行都加载它们(和它们包含的图像)。然而,它们的可见性设置为“Gone”,因此我不确定加载它们会产生什么影响。它们的图像实际上是否被加载了?
请注意,我正在讨论将8个ImageButton替换为8个ViewStubs,而不是1个。
谢谢
我有一个ListView,每行包含大约10个ImageButton。其中大多数按钮的可见性为Gone,只在非常罕见的情况下显示。我想知道是否值得用ViewStubs替换这些ImageButton以避免为ListView的所有行都加载它们(和它们包含的图像)。然而,它们的可见性设置为“Gone”,因此我不确定加载它们会产生什么影响。它们的图像实际上是否被加载了?
请注意,我正在讨论将8个ImageButton替换为8个ViewStubs,而不是1个。
谢谢
ViewStub
是一种愚蠢且轻量级的视图。它没有尺寸,不会绘制任何内容,也不参与任何布局。这意味着ViewStub
非常便宜,可以很容易地在视图层次结构中保留。最好将ViewStub
描述为“惰性包含”。只有当您决定这样做时,引用的布局才会被填充和添加到用户界面。
有时您的布局可能需要很少使用的复杂视图。无论是项目详细信息、进度指示器还是撤消消息,都可以通过仅在需要时加载视图来减少内存使用和加速渲染。
简单来说,ViewStub
用于提高布局渲染效率。通过使用ViewStub
,可以手动创建视图,但不会将其添加到视图层次结构中。在运行时可以轻松填充,当ViewStub
被填充时,viewstub
的内容将被替换为viewstub
中定义的布局。
ViewStub
只有在实际使用/需要它时才会加载,即当您将其可见性设置为VISIBLE
(实际可见)或INVISIBLE
(仍未可见,但其大小不再为0)时。 ViewStub
是一种很好的优化,因为您可以在任何地方拥有具有大量小视图或标题的复杂布局,并且仍然使您的活动快速加载。一旦使用其中一个视图,它就会被加载。
您必须首先在布局中添加ViewStub
,然后才能将其填充到另一个视图中。
注意:ViewStub
的一个缺点是它当前不支持要填充的布局中的<merge/>
标记。同时,ViewStub
不能多次使用。如果不需要长期引用ViewStub
,最好在充气后将其置空,以便GC
可以回收它。
假设您的ViewStub
ID为view_stub
,则需要在activity
中执行以下操作:
ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
View inflatedView = viewStub.inflate();
ImageButton button = (ImageButton) inflatedView.findViewById(R.id.button);
现在你可以随心所欲地使用按钮 :) 即inflate方法返回包含来自XML文件的实际元素的存根布局。
当然,你始终可以拥有onClick
XML属性或动态调用它。
Is a ViewStub worth it?
->For the scenarios that you are specifying, I think `ViewStub` will be worth-shot.
请见下面关于 ViewStub
的链接:
http://android-developers.blogspot.in/2009/03/android-layout-tricks-3-optimize-with.html
http://developer.android.com/reference/android/view/ViewStub.html
http://developer.android.com/training/improving-layouts/loading-ondemand.html
除了使用 ViewStub
,您还可以尝试使用 <include>
标签。 <include/>
将会像整个文件只是一个单独的大文件一样,将 xml 内容包含在您的基本 xml 文件中。这是在不同布局之间共享布局部件的好方法。
编辑:我刚注意到Endzeit在我之前提到了类似的方向。
首先,我会对带有视图和没有视图的膨胀代码进行一些基准测试——只需注释掉适配器代码,这样它就不会尝试访问不存在的视图。
如果从布局中删除视图确实给您带来了必要的改进,而且您说这些视图只在您正在检查的罕见情况下存在,则可以创建它们并根据需要添加/删除它们(使用viewholder引用它们),而不是膨胀那些视图甚至使用视图存根。
您甚至可以进一步做一些懒惰的创建视图,类似于懒加载图像,但我建议您再次运行一些基准测试。
我会使用ViewStubs来加载复杂的布局而不是简单的ImageButton。
编辑2:
查看ViewStub inflate命令,当它需要可见时,它会将给定的布局膨胀然后将其添加到父布局中——由于您要添加一个简单的ImageButton,因此您可以通过在代码中添加ImageButton而不是ViewStub来提高性能。 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/view/ViewStub.java#ViewStub.inflate%28%29
这里有一个关于DDMS的简短介绍: http://magicmicky.github.io/android_development/benchmark-using-traceview/