1 RecyclerView绘制流程
https://www.jianshu.com/p/c52b947fe064
2 复用(缓存)机制
image.png2.1 四级缓存:
第一级:mChangedScrap 与 mAttachedScrap ---> 回收:recycler.scrapView(view);
第二级:mCachedViews--->默认大小为2---> 回收:recycler.recycleViewHolderInternal()
第三级:mViewCacheExtension
第四级:RecycledViewPool ---> 默认大小5(不同的ViewType都会有5个)--->5n+2
2.2 onLayout
- dispatchLayoutStep1
- Adapter的更新;
- 决定该启动哪种动画;
- 保存当前View的信息(getLeft(), getRight(), getTop(), getBottom()等);
- 如果有必要,先跑一次布局并将信息保存下来。
- dispatchLayoutStep2 (真正对子View做布局的地方)
- 计算锚点,以锚点开始填充RecyclerView(其实就是执行fill方法)。
- 执行fill方法,判断RecyclerView是否还有空间,如果有,执行layoutChunk方法,直至填充满。
- layoutChunk方法中,寻找到当前要添加的子view,add到RecyclerView中。
- 对子view进行measure和layout。
- dispatchLayoutStep3
为动画保存View的相关信息; 触发动画; 相应的清理工作。 其实dispatchLayoutStep3()
就是做了一些收尾工作,将一些变量重置,处理下动画。
- mState.mLayoutStep
- 初始化为STEP_START
- 执行完dispatchLayoutStep1后,mState.mLayoutStep = State.STEP_LAYOUT;
- 执行完dispatchLayoutStep2后,mState.mLayoutStep = State.STEP_ANIMATIONS;
- 执行完dispatchLayoutStep3后,mState.mLayoutStep = State.STEP_START;
2.3 优缺点
image.png2.4 参考
https://www.jianshu.com/p/e44961f8add5
https://www.jianshu.com/p/efe81969f69d
https://www.jianshu.com/p/6b0c66d30d8e
3 回收机制
image.png4 进阶优化和使用
https://www.jianshu.com/p/52791ac320f6
5 参考
https://www.jianshu.com/p/61fe3f3bb7ec
https://www.jianshu.com/p/c89c99736c05
https://www.jianshu.com/p/efe81969f69d
https://www.jianshu.com/p/65523b2ce15b
https://www.jianshu.com/p/bdd9f4bdd90a
https://www.jianshu.com/p/3a0d0ce4e649
https://www.jianshu.com/p/af91949db629
https://www.jianshu.com/p/3d52c5ede093
https://www.jianshu.com/p/20851e4e32a7
https://www.jianshu.com/p/c769f4ed298f
https://www.jianshu.com/p/b7ac36190e2c
https://www.jianshu.com/p/abedfa1d6dd1
https://www.jianshu.com/p/70c5d3f0bb34
网友评论