【问题标题】:Android Layout efficiency, multiple views or single with hidden views?Android 布局效率,多个视图或单个隐藏视图?
【发布时间】:2012-05-10 03:36:15
【问题描述】:
我有一个ListView,其中包含布局。有时布局需要看一种方式,有时需要另一种方式。它们主要是布局在不同区域的文本,具有不同的权重大小等。主视图与其他视图的比例约为 5:1。当它需要改变时,只有整个视图的 2/3 发生变化。
我想我有两个选择:
(现在的样子)一种布局(所以它永远不必重新膨胀,因为回收的视图都是一样的)并且视图的第 2 2/3 被隐藏直到需要它要更改,然后代码将显示它并隐藏视图的原始 2/3。
(其他方式)两个布局,其中 1/3 布局重复,每个布局都在其他 2/3 上。然后,当需要使用其中一种不同的布局时,来自 ListView 回收器的旧视图将被丢弃,并膨胀一个新的正确视图,并在移动列表时再次返回。
所以我在这里要问的是,最好隐藏/显示同一布局的部分以防止ListView 中的回收器膨胀更多布局,或者有两个没有额外隐藏视图的缩减布局,并在需要时给它们充气?
【问题讨论】:
标签:
android
android-layout
android-listview
android-view
【解决方案1】:
如果TextViews 是这些布局的主要部分,我认为性能不会有很大差异,因此您可以选择任何一种方式。 我会选择选项二,因为:
普通行布局数与特殊行数的比例很大。如果您保持单一布局方法,那么您将不得不修改代码中 每个 行的布局,正常或特殊,因为您可能正在处理具有 2/ 的回收 View 3 部分在显示正常部分时隐藏(因此您最终每次都修改布局)。如果您要使用第二个选项,那么您可以从 getView 方法中删除这部分,并简单地使用 switch 来查看您正在处理的行类型(每次在getView 方法,您让 ListView 处理它,为您提供正确类型的行布局)。不要担心膨胀另一个布局文件(一次),这不是要害怕的性能损失。
使用一种类型的布局意味着即使用户看不到 Views 仍保留在内存中(因此您可能会阻止 ListView 膨胀更多 Views(仅事实上,有一次),但与此同时,您甚至没有向用户显示的内存占用了更多内存)。第一个选项的优点是将数据绑定到行更简单,因为您可以使用所有视图(即使用户没有看到其中的一部分)而不是第二个选项,您可以查看需要根据行类型显示哪些数据。
代码可读性。拥有两种行类型并测试以查看您在 getView 方法中获得的哪一种,当您看到每种行类型的逻辑时,它更有意义。此外,如果您计划在未来更改这些行布局或添加更多行类型,那会更好。
ListView 在回收视图方面做得很好,只要您帮助它提供行类型。
编辑:ListView 将为您在适配器中声明的每种类型保留一个回收视图。所以ListView 只会在它第一次在ListView 中找到第二个布局时膨胀第二个布局,下次当它需要一个带有类型的行时,它将使用回收的一个(并且它将维护两种类型的回收视图,第一行和第二行类型)。
【解决方案2】:
实际上,这点额外的 GC 恕我直言,不应该成为您决定的驱动因素。
我会走更容易维护和理解的路线。
xml 中还有一个很好用的 include 标记,如下所示:
<include
android:id="@+id/abc"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
layout="@layout/abc" , where abc = the xml file you want to include
/>