Android布局效率,多个视图还是单个隐藏视图?

时间:2012-05-10 03:36:15

标签: android android-layout android-listview android-view

我有ListView的布局。有时布局需要一种方式,有时候另一种方式。它们主要是在不同区域布置不同重量大小的文本等。主要视图与其他视图的比例约为5:1。当需要更改时,只有整个视图的2/3发生变化。

我想我有两个选择:

  1. (现在的方式)一个布局(所以它永远不必重新充气,因为回收的视图都是相同的),视图的第二个2/3被隐藏,直到需要它为止要更改,然后代码将显示它并隐藏视图的原始2/3。

  2. (另一种方式)两个布局,其中1/3布局重复,每个布局都在其他2/3上。然后,当需要使用其中一个不同的布局时,ListView回收器中的旧视图会被丢弃,新的正确视图会被充气,并且在移动列表时会再次返回。

  3. 所以我在这里要问的是隐藏/显示相同布局的部分以防止ListView中的回收者使更多布局膨胀,或者有两个简化的布局而没有额外的隐藏观点,并在需要时让它们膨胀?

2 个答案:

答案 0 :(得分:2)

如果TextViews是这些布局的主要部分,我不认为性能会有很大差异,所以你可以选择其中任何一种方式。 会使用选项二,因为:

  1. 正常行布局数与特殊行数之间的比率很大。如果您采用单一布局方法,则必须修改代码中每个行的正常或特殊布局,因为您可能正在处理已回收的View当显示正常时,隐藏2/3部分隐藏(因此每次最终修改布局)。如果您要使用第二个选项,那么您可以从getView方法中删除此部分,只需使用switch查看您正在处理的行类型(不再修改行布局)每次使用getView方法时,都会让ListView通过为您提供正确的行布局类型来处理它。不要担心膨胀另一个布局文件(一次),这不是害怕的性能打击。

  2. 使用一种类型的布局意味着即使用户没有看到Views内存,ListView也会留在内存中(因此您可能会阻止Views更多地膨胀{ {1}}(实际上只有一次)但同时你用你甚至没有向用户展示的内存占用更多​​的内存。第一个选项的优点是数据与行的绑定更简单,因为您可以使用所有视图(即使用户没有看到它们的一部分)而不是第二个选项,您将拥有查看需要根据行类型显示哪些数据。

  3. 代码可读性。有两种行类型并测试以查看getView方法中的哪一种,它更有意义,因为您可以看到每种类型行的逻辑。此外,如果您计划将来更改这些行布局或添加更多行类型会更好。

  4. 只要您提供行类型,ListView在回收视图方面做得很好。 编辑:ListView将为您在适配器中声明的每种类型保留一个回收视图。因此,ListView只会在第一次在ListView中找到它时才会使第二个布局膨胀,下次当它需要带有类型的行时,它将使用已回收的布局(并且它将保持2循环视图的类型,第一和第二行类型。)

答案 1 :(得分:0)

实际上,这一点额外的GC恕我直言不应该是你决定的驱动因素。

我会选择更容易维护和理解的路线。

此外,xml中还有一个非常有用的包含标记,如下所示:

<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
    />