在可扩展的RecyclerView中缓慢渲染ListView

时间:2018-05-04 19:17:22

标签: android performance listview android-recyclerview

我正在开发的应用程序出现性能问题。 因此,应用程序的结构基本上是一个包含三个片段的活动。

其中一个片段是RecyclerView,其中每一行都有一个ListView(在创建和设置适配器时)在适配器的onBindViewHolder方法中。

对于ListView适配器,我使用带有字符串数组的简单ArrayAdapter,以及一个只有CheckedTextView的自定义布局。

此ListViews以可见性消失开始,并在单击行时显示。

现在,我遇到的问题是我第一次点击一行"展开"这个子列表(ListView)它会冻结几秒钟并跳过100-140帧。每次ListView折叠或展开后,工作正常并且不跳帧。这发生在每一行。

所以我在想的是ListView没有被充气(或绑定?),直到第一次需要(visibility == true)并且产生性能问题。

我通过Android Studio中的Profiler注意到的另一件事是,在扩展ListView时,与第一次渲染RecyclewView时相比,CPU使用率更高,时间更长,这是奇怪的是,与使用默认的ArrayAdapter和仅3个项目的ListView相比,RecyclerView Adapter具有更复杂的逻辑和更多的项目。

以下是供参考的图片:

Image of the Android Studio Profiler

  • 申请开始后,第一次触摸事件(紫色圆圈在 top)是将RecyclerView片段带入的按钮 查看,CPU使用率为50%,持续1秒左右。
  • 第二次触摸 事件是在第一个单击RecyclerView中的行时 时间,CPU使用率为50%,持续3秒左右(三次 许多!)。
  • 接下来的四个触摸事件是单击同一行时 再次,折叠和扩展它,每个使用最多10%的CPU。
  • 最后一次触摸事件再次点击了另一行 第一次。

这是RecyclerView Row的布局:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout_rv_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/rv_item_padding">

    <RelativeLayout
        android:id="@+id/row_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Title"
            android:textSize="22sp"/>

        <TextView
            android:id="@+id/tv_subtitle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/tv_title"
            android:text="Subtitle"
            android:textSize="12sp" />

        <ImageView
            android:id="@+id/iv_icon"
            android:visibility="visible"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:src="@drawable/ic_arrow" />
    </RelativeLayout>

    <ListView
        android:id="@+id/row_extended"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:orientation="vertical"
        android:layout_below="@+id/row_main"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:animationCache="false"
        android:scrollingCache="false">

    </ListView>
</RelativeLayout>

和ListView子布局:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeightSmall"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" />

这是Fragment的布局:

<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".fragments.RVFragment"
    android:layout_marginTop="160dp">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </android.support.v7.widget.RecyclerView>

        <Button
            android:id="@+id/btn_done"
            style="@style/MyApp.Buttons.Basic"
            android:layout_width="match_parent"
            android:layout_height="@dimen/bottom_nav_height"
            android:layout_marginBottom="@dimen/bottom_nav_height"
            android:text="@string/completed"
            android:textSize="20dp" />
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

任何帮助都会非常感激。一段时间以来,我一直在摸不着头脑。

更新:     我可能会尝试使用thoughtbot / expandable-recycler-view并查看它是如何发生的,我的实现可能有问题。

最后更新:     所以,问题似乎已经解决了。我希望我能更好地解释,但我所做的只是移动几个文件夹,现在它完美无缺。

0 个答案:

没有答案