【问题标题】:Performance impact of inflating layouts which have elements with visibility=gone具有可见性=消失的元素的膨胀布局的性能影响
【发布时间】:2013-05-09 03:04:50
【问题描述】:

我正在尝试提高我们的列表视图渲染性能并正在研究微调。 (我们使用 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 很昂贵),但我想知道是否有必要将成功和失败元素的处理重构并拆分为两个不同的布局,然后分别使用 @987654324 进行膨胀@ 和getItemViewType(int position)

我的列表项布局的额外失败布局代码(并因此增加了文件大小)是否会影响性能,即使它在膨胀期间设置为 visibility=GONE?

任何见解将不胜感激,谢谢。

【问题讨论】:

    标签: android performance android-layout android-listview


    【解决方案1】:

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

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

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

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

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

    另外,在 holder 中缓存行视图。

    【讨论】:

    • 感谢您的见解 - 这正是我想知道的。我们在应用程序中面临一些内存问题,因此清理这些视图可能有助于使应用程序更轻巧。我知道指定根节点的膨胀,我们正在使用持有者模式,但无论如何感谢你的好技巧!
    猜你喜欢
    • 2020-12-05
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多