记录一次RecyclerView卡顿案例和解决方案。
需求:界面由两部分组成,顶部一个图片,图片下面是列表。在列表滑动时,图片跟着滑动。
实现:NestedScrollView [ LinearLayout [ ImageView , RecyclerView ] ]。
结果:当数据量较大时,RecyclerView 会越划越卡。
原因:NestedScrollView 嵌套 RecyclerView,NestedScrollView 的 MeasureSpec.UNSPECIFIED 测量子View,导致 RecyclerView 高度不确定,有多少item就会创建多少个ViewHolder,导致RecyclerView的复用机制失效。
解决:
使用单个RecyclerView,顶部图片使用viewType实现。
使用 CoordinatorLayout 替代 NestedScrollView。使用 AppBarLayout 的 app:layout_scrollFlags="scroll" 属性配合 app:layout_behavior="@string/appbar_scrolling_view_behavior" 属性。(NestedScrollView + RecyclerView 本质是为了解决嵌套滑动的问题。)
CoordinatorLayout [ AppBarLayout [ ImageView ] , RecyclerView ]
注意:AppBarLayout 使用 app:elevation="0dp" 属性,不是 android:elevation="0dp"。RecyclerView 使用 app:layout_behavior="@string/appbar_scrolling_view_behavior" 属性。
附:NestedScrollView + RecyclerView ,当两者可滑动方向 [一致] 时,可以用于列表数据量固定且较小的时候。当两者可滑动方向 [不一致] 时,可以正常使用。本质就是在 RecyclerView 的滑动方向上,尺寸是一个确定的值,使得复用机制正常工作。