膨胀布局的性能影响,其中元素具有可见性=已消失

时间:2013-05-09 03:04:50

标签: android performance android-layout android-listview

我正在尝试改进列表视图渲染性能并立即调查微调。 (我们使用viewHolder,获取图像异步,在滚动时暂停图像显示,已禁用滚动缓存)

现在我正在检查布局,并为单个列表项的布局遇到了类似下面的设置,它在getView中被夸大了。

自定义列表适配器的getView()

if (convertView == null) {
  convertView = inflater.inflate(R.layout.zzz_list_item, null);
  ...save stuff in holder etc.

zzz_list_item.xml

<LinearLayout
    android:id="@+id/layout_success"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/base"
    android:orientation="vertical"
    android:paddingBottom="30dp" >
 ...many lines of a "success" item layout
 </LinearLayout>

  <LinearLayout
    android:id="@+id/layout_failure"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:visibility="gone" >
  ...many lines for a failure item layout
 </LinearLayout>

在我们的自定义列表视图适配器的getView方法中,可见性得到进一步控制

getView()方法 - 每次都执行

 if(isSuccessfulItem){
   ((LinearLayout) convertView.findViewById(R.id.layout_failure)).setVisibility(View.GONE);
   ((LinearLayout) convertView.findViewById(R.id.layout_success)).setVisibility(View.VISIBLE);
 } else {
   ((LinearLayout) convertView.findViewById(R.id.layout_failure)).setVisibility(View.VISIBLE);
   ((LinearLayout) convertView.findViewById(R.id.layout_success)).setVisibility(View.GONE);
 }

虽然这也可能是一个小的性能需求(getView很昂贵),但我想知道将成功和失败元素的处理重构并拆分成两个不同的布局是否有意义,然后使用{{ 1}}和getViewTypeCount()

我的列表项布局的附加故障布局代码(以及因此增加的文件大小)是否会影响性能,即使在通货膨胀期间设置为visibility = GONE也是如此?

非常感谢任何见解,谢谢。

1 个答案:

答案 0 :(得分:3)

  

是否有额外的故障布局代码(因此增加了文件   我的列表项布局影响性能,即使它是   在通货膨胀期间设置为visibility = GONE?

无论哪种方式,性能增益或损失都是最小的。可见性设置为gone的视图不需要在布局和测量阶段进行计算,因为它被忽略但它确实消耗了内存(这是您可以讨论的内容)。使用当前的实现,即使您不需要/使用行布局的失败部分,您也会占用内存(将其乘以屏幕上可见的行数)。将当前行拆分为两部分将清除内存需要,因为每行只有实际使用的视图。

如果我是你,我会实现两种行类型,因为我认为它更干净(并且它也不会在内存中添加无用的视图)。

您可能知道这一点,但请使用:

convertView = inflater.inflate(R.layout.zzz_list_item, convertView, false);

另外,将行视图缓存在持有者中。