RecyclerView性能优化

概述

RecyclerView有着极高的灵活性,能实现ListView、GridView的所有功能。在日常开发中,使用非常广泛,如果使用不当将会影响到应用的整体性能,所以有必要了解一下如何更高效的使用。

1、数据处理与视图绑定分离

RecyclerView的bindViewHolder方法是在UI线程进行的,如果在该方法进行耗时操作,将会影响滑动的流畅性。

2、数据优化

分页加载远端数据,对拉取的远端数据进行缓存,提高二次加载速度;

对于新增或删除数据通过DiffUtil,来进行局部数据刷新,而不是一味的全局刷新数据。

DiffUtil是support包下新增的一个工具类,用来判断新数据和旧数据的差别,从而进行局部刷新。DiffUtil的使用,在原来调用mAdapter.notifyDataSetChanged()的地方。

3、布局优化

减少过度绘制

减少布局层级,可以考虑使用自定义View来减少层级,或者更合理的设置布局来减少层级。

4、减少xml文件inflate时间

xml文件包括:layout、drawable的xml,xml文件inflate出ItemView是通过耗时的IO操作。可以使用代码去生成布局,即new View()的方式。这种方式是比较麻烦,但是在布局太过复杂,或对性能要求比较高的时候可以使用。

5、减少View对象的创建

一个稍微复杂的 Item 会包含大量的 View,而大量的 View 的创建也会消耗大量时间,所以要尽可能简化 ItemView;设计 ItemType 时,对多 ViewType 能够共用的部分尽量设计成自定义 View,减少 View 的构造和嵌套。

6、设置高度固定

如果item高度是固定的话,可以使用RecyclerView.setHasFixedSize(true);来避免requestLayout浪费资源。

7、共用RecycledViewPool

在嵌套RecyclerView中,如果子RecyclerView具有相同的adapter,那么可以设置RecyclerView.setRecycledViewPool(pool)来共用一个RecycledViewPool。

Note: 如果LayoutManager是LinearLayoutManager或其子类,需要手动开启这个特性:layout.setRecycleChildrenOnDetach(true)。

8、RecyclerView数据预取

RecyclerView25.1.0及以上版本增加了Prefetch功能。

用于嵌套RecyclerView获取最佳性能。

详细分析:RecyclerView 数据预取。

9、加大RecyclerView的缓存

用空间换时间,来提高滚动的流畅性。

recyclerView.setItemViewCacheSize(20);

recyclerView.setDrawingCacheEnabled(true);

recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

10、增加RecyclerView预留的额外空间

额外空间:显示范围之外,应该额外缓存的空间

newLinearLayoutManager(this{

@Override

protectedintgetExtraLayoutSpace(RecyclerView.Statestate){

returnsize;

    }

};

11、减少ItemView监听器的创建

对ItemView设置监听器,不要对每个item都创建一个监听器,而应该共用一个XxListener,然后根据ID来进行不同的操作,优化了对象的频繁创建带来的资源消耗。

12、优化滑动操作

设置RecyclerView.addOnScrollListener();来在滑动过程中停止加载的操作。

13、刷新闪烁

调用notifyDataSetChange时,适配器不知道整个数据集中的那些内容以及存在,再重新匹配ViewHolder时会发生闪烁。

设置adapter.setHasStableIds(true),并重写getItemId()来给每个Item一个唯一的ID

14、回收资源

通过重写RecyclerView.onViewRecycled(holder)来回收资源。

参考来源:

RecyclerView 性能优化

Android recycleView 的一些优化与相关问题

RecyclerView Scrolling Performance

Optimizing RecyclerView/ListView

RecyclerView 列表类控件卡顿优化

RecyclerView 数据预取

DiffUtil新工具类,让你的RecyclerView飞一会

关于RecyclerView你知道的不知道的都在这了(上)

关于RecyclerView你知道的不知道的都在这了(下)

https://www.jianshu.com/p/bd432a3527d6

你可能感兴趣的:(RecyclerView性能优化)