RecyclerView复用机制

上一篇文章分析RecyclerView刷新机制知道LayoutManager在布局子View时会向Recycler索要一个ViewHolder。但从Recycler中获取一个ViewHolder的前提是Recycler中要有ViewHolder。那Recycler中是如何有ViewHolder的呢?
本文会分析两个问题:

  1. RecyclerViewView是在什么时候放入到Recycler中的。以及在Recycler中是如何保存的。
  2. LayoutManager在向Recycler获取ViewHolder时,Recycler寻找ViewHolder的逻辑是什么。

何时存、怎么存何时取、怎么取的问题。何时取已经很明显了:LayoutManager在布局子View时会从Recycler中获取子View。 所以本文要理清的是其他3个问题。在文章继续之前要知道Recycler管理的基本单元是ViewHolderLayoutManager操作的基本单元是View,即ViewHolderitemview。本文不会分析RecyclerView动画时view的复用逻辑。

为了接下来的内容更容易理解,先回顾一下Recycler的组成结构:

Recycler的组成.png

  • mChangedScrap : 用来保存RecyclerView做动画时,被detach的ViewHolder
  • mAttachedScrap : 用来保存RecyclerView做数据刷新(notify),被detach的ViewHolder
  • mCacheViews : Recycler的一级ViewHolder缓存。
  • RecyclerViewPool : mCacheViews集合中装满时,会放到这里。

先看一下如何从Recycler中取一个ViewHolder来复用。

从Recycler中获取一个ViewHolder的逻辑

LayoutManager会调用Recycler.getViewForPosition(pos)来获取一个指定位置(这个位置是子View布局所在的位置)的viewgetViewForPosition()会调用tryGetViewHolderForPositionByDeadline(position...), 这个方法是从Recycler中获取一个View的核心方法。它就是如何从Recycler中获取一个ViewHolder的逻辑,即怎么取。方法太长, 我做了很多裁剪:

 

ViewHolder tryGetViewHolderForPositionByDeadline(int position, boolean dryRun, long deadlineNs) {
    ...
    if (mState.isPreLayout()) {     //动画相关
        holder = getChangedScrapViewForPosition(position);  //从缓存中拿吗?不应该不是缓存?
        fromScrapOrHiddenOrCache = holder != null;
    }
    // 1) Find by position from scrap/hidden list/cache
    if (holder == null) {
        holder = getScrapOrHiddenOrCachedHolderForPosition(position, dry
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值