RecyclerView机制详解

本文详细解析了RecyclerView的四级缓存结构,包括mAttachedScrap、mChangedScrap、mCachedViews和ViewCacheExtension,以及RecyclerdViewPool的作用。还介绍了Item的状态管理与回收操作,以及如何通过局部更新、优化滑动和预加载来提高性能。
摘要由CSDN通过智能技术生成

目录

1.RecyclerView的多级缓存机制

1.1 四级缓存层次

1.2 每一级缓存具体作用及具体场景

mAttachedScrap:

mChangedScrap:

mCachedViews:

ViewCacheExtension

RecyclerdViewPool

1.3 二级缓存论

1.4 Item状态

1.5 四种对Item回收和布局的操作

2.核心组件

3.RecyclerView性能优化

3.1 局部更新数据

3.2 优化列表滑动

3.3 预加载数据


1.RecyclerView的多级缓存机制

1.1 四级缓存层次

1.2 每一级缓存具体作用及具体场景

mAttachedScrap:

作用:已添加item与被删除item的   临时存储空间

场景:RecyclerView滚动时、删除Item后用notifyItemRemoved通知更新

mChangedScrap:

作用:存放可见范围更新的Item

场景:1、可见范围内的Item有更新,并且使用notifyItemChanged方法通知更新时;

           2、播放动画(播放完viewholder会交给RecycledViewPool)

mCachedViews:

作用:滚动过程中,存放未被重新使用且状态无变化的Item

场景:1、滚动过程

           2、perfetch(prefetch机制是RecyclerView滚动时借助Handler来事先从RecycledViewPool中取出即将要显示的Item,随即扔到mCachedViews)

ViewCacheExtension

作用:是一个可选的缓存层,允许自定义缓存策略,存储更多的或者特定类型ViewHolders

RecyclerdViewPool

作用:缓存Item的最终站,

                保存RemovedChanged、以及mCachedViews满了之后更旧的Item

场景:Item被移除、Item有更新、滚动过程

1.3 二级缓存论

mCachedViews 一级缓存:

        ViewHolder数据还在,只有原来的position可用,不需要重新绑定数据
        且 mCachedViews 默认大小为 2

RecycledViewPool 二级缓存:

        ViewHolder数据重置,需要重新绑定数据
        RecycledViewPool 根据不同的 item type 创建不同的 List,每个 List 默认大小为 5
复用时,只要 RecycledViewPool 中对应 type 的 List 有 ViewHolder 缓存,最后一个拿出来复用

1.4 Item状态

四种:INVALID、REMOVED、UPDATE、POSITION_UNKNOWN 

状态未变——》存放mCachedViews

状态更新——》存放RecyclerdViewPool

1.5 四种对Item回收和布局的操作

     0. 滚动 :Item布局完成之后,会对刚刚没有再次布局的Item进行缓存回收,这个缓存分两种:

           即将重用,Recycler.mCachedViews来保管

           取出后会回调onBindViewHolder,RecycledViewPool来保管       

  1. Inserted:如果刚好插入在屏幕可见范围内,会从RecycledViewPool中找一个相同类型的ViewHolder 来重新绑定数据并layout;

  2. Removed:会把对应ViewHolder扔到mAttachedScrap中并播放动画,动画播放完毕后移到RecycledViewPool里;

  3. Changed:先把旧的ViewHolder扔mChangedScrap中,然后像Inserted那样从RecycledViewPool中找一个相同类型的ViewHolder来重新绑定数据。旧ViewHolder用来播放动画,播完同样会移到RecycledViewPool里。

2.核心组件

Adapter->提供ViewHolder和绑定视图数据,如notifyItemChanged(int position) 

ViewHolder->作为每个视图的容器

ItemAnimator->局部更新发生时,RecyclerView会利用ItemAnimator来添加、移除或更新项的动画效果

LayoutManager->Item的布局和回收

3.RecyclerView性能优化

3.1 局部更新数据

通过notifyItemChanged(int position)等方法进行局部数据更新,

而不是使用notifyDataSetChanged()刷新整个列表,

这减少了RecyclerView的重新布局次数

3.2 优化列表滑动

通过自定义ItemDecorationItemAnimator以及合理使用LayoutManager的特性来优化列表的滑动和动画效果,减少卡顿现象。

3.3 预加载数据

当用户滑动接近列表底部时,提前加载更多的数据,

以避免到达列表末尾时出现明显的加载等待时间

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值