Android-一个ViewStub值得吗?

Android-一个ViewStub值得吗?,android,performance,viewstub,Android,Performance,Viewstub,我有一个ListView,其中每行ListView包含大约10个ImageButton。大多数按钮的可见性都消失了,只有在极少数情况下才会出现。我想知道是否值得将这些ImageButton替换为ViewStub,以避免在listview的所有行中一直加载它们(以及它们包含的图像)。然后,它们的可见性再次设置为“消失”,因此我不确定加载它们会产生什么影响。他们的图像真的被加载了吗 请注意,我指的是将8个图像按钮替换为8个视图存根,而不是1个 干杯使用ViewStub代替ImageButton 这是

我有一个ListView,其中每行ListView包含大约10个ImageButton。大多数按钮的可见性都消失了,只有在极少数情况下才会出现。我想知道是否值得将这些ImageButton替换为ViewStub,以避免在listview的所有行中一直加载它们(以及它们包含的图像)。然后,它们的可见性再次设置为“消失”,因此我不确定加载它们会产生什么影响。他们的图像真的被加载了吗

请注意,我指的是将8个图像按钮替换为8个视图存根,而不是1个


干杯

使用ViewStub代替ImageButton

这是因为

。默认情况下,ViewStub是零大小的视图,而图像按钮不是


。视图存根自然是一个不可见的视图。它的性能优于image button,因为它只在其状态可见时加载运行时

当您将视图可见性设置为gone时,这意味着该视图不可见,它不占用任何布局空间,但其数据将加载到其中

现在,ListView会删除不可见的视图,或者说是出于性能原因而超出屏幕范围的视图

ViewStub是一个不可见的、大小为零的视图,可用于在运行时惰性地膨胀布局资源

因此,我认为如果你想从我的观点来看,我更喜欢具有可见性的视图,而不是对ViewStub使用太多的逻辑并创建和膨胀。。。等等

但另一方面

充气时,渲染性能将显示在图片中 这些观点

我的猜测是,对ViewStub进行充气要比对其进行充气便宜得多 从XML或通过更改可见性来膨胀视图。视图存根是 特别适用于需要添加/删除(不确定)视图(例如。 将电话号码添加到给定联系人)。希望你就是这样 寻找

参考:

以下是DDMS的一些很好的简要介绍:

编辑:刚刚注意到Endzeit在我面前评论了一个类似的方向

首先,我将围绕有视图和无视图的膨胀代码进行一些基准测试——只需注释掉适配器代码,这样它就不会试图访问不存在的视图

如果从布局中删除视图确实给您带来了您认为必要的改进,并且由于您说视图仅出现在您正在适配器中检查的少数情况下, 然后,不要膨胀这些视图,甚至使用视图存根,而是在代码中创建它们,并根据需要添加/删除它们(使用viewholder引用它们)

您甚至可以更进一步,延迟创建这些视图,类似于延迟加载图像,但我只会在再次运行一些基准测试之后才这样做

我会使用ViewStubs来加载复杂的布局,而不是简单的图像按钮

编辑2:

查看ViewStub充气命令,这是它在需要可见时所做的操作。您可以看到它会改变给定的布局,然后将其添加到父布局中-由于您要添加一个简单的ImageButton,您可以通过不使用ViewStub而只在代码中添加ImageButton来获得性能。
A
ViewStub
是一个
哑且轻量级的视图。它没有尺寸
,它不绘制任何东西,也不以任何方式参与布局。这意味着
ViewStub
充气成本非常低,在视图层次结构中保持
成本非常低。
ViewStub
可以最好地描述为
lazy include
ViewStub
引用的布局是
膨胀的,当您决定
时,仅将
添加到用户界面

有时,您的布局可能需要很少使用的
复杂视图。无论是项目详细信息、进度指示器还是撤消消息,都可以通过仅在需要时加载视图来减少内存使用并加快渲染速度

只需使用
ViewStub
即可提高渲染布局的效率。通过使用
ViewStub
,可以手动创建视图,但不能将其添加到视图层次结构中。在运行时,可以很容易地膨胀,当
ViewStub
膨胀时,
ViewStub
的内容将替换为
ViewStub
中定义的布局

只有在您实际使用/需要时,即当您将其可见性设置为“可见”(实际可见)或“不可见”(仍不可见,但其大小不再为0)时,才会加载
ViewStub
ViewStub
a
很好的优化
,因为你可以在任何地方拥有一个复杂的
布局,其中包含大量的小视图或标题
,而且你的
活动仍然可以快速加载
。一旦您使用其中一个视图,它将被加载

必须首先在布局中添加
ViewStub
,然后才能将其充气到另一个视图中

注意:视图存根的一个缺点是它当前不支持要膨胀的布局中的
标记。Alos
ViewStub
不能使用多次。另外,保持对
ViewStub
的长期引用是不必要的,如果需要,最好在充气后将其置空,这样
GC
就可以吃掉它

假设您的
ViewStub
ID是
view\u stub
。您需要在
活动中执行以下操作:

ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
View inflatedView = viewStub.inflate();
ImageButton button = (ImageButton) inflatedView.findViewById(R.id.button);
现在,您可以使用按钮执行任何操作:)也就是说,充气方法返回存根布局,其中包含XML文件中的实际元素

当然,您可以始终具有
onClick
XML属性,也可以动态调用该属性

Is a ViewStub worth it?
->For the scenarios that you are specifying, I think `ViewStub` will be worth-shot.  
请参见下面关于
ViewStub的URL

您可以尝试
标记
,而不是
ViewStub
将立即生效