【性能优化】RecyclerView性能优化


布局渲染优化

When using `setHasFixedSize() in an RecyclerView, wrap_content cannot be used as a value for size in
上述问题是lint检查报错

  1. RecyclerView.setHasFixedSize(true); // 布局大小固定
    当adapter内的数据内容发生改变不会影响RecyclerView大小时,可以设置此项属性,以节省每个item布局重绘,提高性能。尤其是在插入、删除时性能提升更明显。RecyclerView在条目数量改变,会重新测量、布局各个item,如果设置了setHasFixedSize(true),由于item宽高固定的,adapter的内容改变时,RecyclerView不会整个布局都重绘。

    回到上面那个lint问题,setHasFixedSize(true);使用需要设置recyclerview宽高设置固定,或者直接忽略这个警告@SuppressWarnings(“InvalidSetHasFixedSize”)
    Understanding RecyclerView setHasFixedSize

  2. RecyclerView.setItemViewCacheSize(10); // 设置缓存的ViewHolder数量
    设置视图之外的缓存视图数量,可以重用这些视图

  3. 减少布局嵌套层级
    减少item的过度绘制, 减少布局层级,尽量少的布局嵌套,尽量少的控件

合理的刷新机制

慎用全局刷新notifyDataSetChanged(),造成不必要的刷新性能浪费,按需使用以下的局部刷新:


notifyItemChanged(int position)
notifyItemInserted(int position)
notifyItemRemoved(int position)
notifyItemMoved(int fromPosition, int toPosition) 
notifyItemRangeChanged(int positionStart, int itemCount)
notifyItemRangeInserted(int positionStart, int itemCount) 
notifyItemRangeRemoved(int positionStart, int itemCount) 

使用DiffUtil进行布局刷新

DiffUtils 是 Support-v7:24:2.0 中,更新的工具类。它主要是为了配合 RecyclerView 使用,通过比对新、旧两个数据集的差异,生成旧数据到新数据的最小变动,然后对有变动的数据项,进行局部刷新。

DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallBack(oldDatas, newDatas), true);
diffResult.dispatchUpdatesTo(mAdapter);

参考

  1. RecyclerView的经常用到的属性解析与性能优化
  2. RecyclerView 配合 DiffUtil,好用到飞起
  3. RecyclerView性能优化及高级使用
  4. 解决Android FlexboxLayoutManager 嵌套卡顿问题
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值