随着RecyclerView的广泛使用,我们需要持续不断对RecyclerView页面进行优化,如果您想提高RecyclerView滚动或滑动的性能,必须要了解RecyclerView新特性:Prefetch
在滚动和滑动的时候,RecyclerView需要显示进入屏幕的新item,这些item需要被绑定数据(如果缓存中没有类似的item很可能还需要创建),然后把它们放入布局并绘制。当所有这些工作慢吞吞进行的时候,UI线程会慢慢停下来等待其完成,然后渲染才能进行,滚动才能继续。
google官方在 Support Library v25 版本中,为RecyclerView增加了Prefetch。
android 5.0以后,android系统为了提高UI渲染的效率引入了RenderThread
,在UI渲染过程中,主线程可以更加专注于跟用户进行交互,而RenderThread
将通知GPU处理界面的绘制工作,这样可以大大提高页面流畅度,这就好比webview开启硬件加速为了更快的渲染、画布的一些绘制有时也需要开启硬件加速等等。
RecyclerView自带的布局管理器有:LinearLayoutManager
、GridLayoutManager
、StaggeredGridLayoutManager
,它们默认支持Prefetch,当然,我们可以手动关闭Prefetch支持,代码如下:
linearLayoutManager.setItemPrefetchEnabled(false);
setItemPrefetchEnabled
方法可以设置RecyclerView是否支持Prefetch
true:开启Prefetch
false:关闭Prefetch
除了setItemPrefetchEnabled
之外,还有三个方法与Prefetch有关,分别是collectAdjacentPrefetchPositions
、collectInitialPrefetchPositions
、setInitialPrefetchItemCount
。
- setInitialPrefetchItemCount:设置预取数量
- collectAdjacentPrefetchPositions:更新布局状态,并根据布局状态设置预取位置
- collectPrefetchPositionsForLayoutState:根据布局状态设置预取位置
- collectInitialPrefetchPositions:计算预取位置
当重写LayoutManager
时,如果开启了Prefetch,这四个方法需要重写。至于怎么重写等以后再补充吧。
当使用系统自带的LinearLayoutManager
、GridLayoutManager
、StaggeredGridLayoutManager
时,默认已经支持Prefetch,所以程序猿不需要做任何操作。
[本章完...]