2

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

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

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

4

1 回答 1

3

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

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

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

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

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

此外,将行视图缓存在持有人中。

于 2013-07-04T11:20:13.220 回答