2

安卓 4.1.2。我有LinearLayout一个ListView带孩子的。我在这个列表视图中添加了 20 行,其中包含三个TextView控件的自定义行布局。这些行中有一半是可见的,所以我需要滚动才能看到其余的行。问题是当我从顶部或底部开始滚动时,应用程序似乎挂起几秒钟(中间看起来还可以)。

我知道有几种优化可以使用。到目前为止,我已经尝试过这个:

  1. 在我的自定义ArrayAdapter中,我使用 aViewHolder来避免调用findViewById.
  2. getView()中,LayoutInflateris 仅在convertViewis时使用null
  3. getViewTypeCount()返回 1,getItemViewType(...)返回 0。
  4. 删除对我的文本视图的setText()所有调用。setColor()
  5. 断开调试器。

列表视图还有哪些其他可能的瓶颈?

我的行布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/my_text1"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textColor="@android:color/white"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/my_text2"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="4"
        android:ellipsize="end"
        android:textColor="@android:color/white" />

    <TextView
        android:id="@+id/my_text3"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:gravity="right"
        android:textColor="@android:color/white" />
</LinearLayout>

我确实怀疑该layout_weight属性,但删除它们并没有帮助!在另一个解决这个滞后问题的尝试中,我ListView有以下风格:

<ListView
        android:id="@+id/my_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="3dip"
        android:background="@android:color/transparent"
        android:cacheColorHint="@android:color/transparent"
        android:persistentDrawingCache="scrolling"
        android:scrollingCache="false" />

如您所见,我几乎尝试了所有方法。尽管如此,当我滚动浏览这 20 行时,UI 在到达顶部/底部时会挂起 2-4 秒。因此,来回滚动会使应用程序冻结!

我在这里想念什么?

4

1 回答 1

3

Another thing to consider is the possible overdraw in your list items, which can be made visible by an option in the developer settings on your device.

For general performance issues, especially in a ListView, I can only recommend Romain Guy's "epic" article: Android Performance Case Study. Overdraw is also referenced there as one major issue.

于 2013-01-13T11:51:48.673 回答