我正在开发的应用程序出现性能问题。 因此,应用程序的结构基本上是一个包含三个片段的活动。
其中一个片段是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具有更复杂的逻辑和更多的项目。
以下是供参考的图片:
这是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并查看它是如何发生的,我的实现可能有问题。
最后更新: 所以,问题似乎已经解决了。我希望我能更好地解释,但我所做的只是移动几个文件夹,现在它完美无缺。