6

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

我想我有两个选择:

  1. (现在的样子)一个布局(所以它永远不必重新膨胀,因为回收的视图都是一样的)并且视图的第 2 2/3 是隐藏的,直到需要更改它,然后代码将显示它并隐藏视图的原始 2/3。

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

所以我在这里要问的是,最好隐藏/显示同一布局的部分以防止 a 中的回收器ListView膨胀更多布局,或者有两个没有额外隐藏视图的缩减布局,并在它们膨胀时让它们膨胀需要吗?

4

2 回答 2

3

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

  1. 正常行布局数与特殊行数之间的比例很大。如果您保持单一布局方法,那么您将不得不在代码中修改每一行的布局,无论是正常的还是特殊的,因为您可能正在处理一个View在显示正常时隐藏了 2/3 部分的回收一个(所以你最终每次都修改布局)。如果您要使用第二个选项,那么您可以从getView方法中消除这部分,并简单地使用 aswitch查看您正在处理的行类型(在方法中每次都不再修改行布局getView,您让ListView句柄通过为您提供正确类型的行布局)。不要担心膨胀另一个布局文件(一次),这不是要害怕的性能损失。

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

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

ListView只要您帮助它提供行类型,它就可以很好地回收视图。编辑:ListView将为您在适配器中声明的每种类型保留一个回收视图。因此,ListView它只会在第一次在 中找到第二个布局时膨胀第二个布局ListView,下次当它需要具有类型的行时,它将使用回收的一个(并且它将维护 2 种类型的回收视图,第一行和第二行类型)。

于 2012-05-10T05:15:10.037 回答
0

实际上,这一点额外的 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
    />    
于 2012-05-10T05:14:38.400 回答