RecyclerView将布局的职责委托给了LayoutManager类,而测量和布局联系很紧密,因此测量的一部分逻辑也被委托给了LayoutManager,RecyclerView大多数情况下会基于LayoutManager布局之后的ChildView分布情况来决定自己的最终尺寸。
RecyclerView支持两种measure模式,取决于LayoutManager的mAutoMeasure属性:
- AutoMeasure(LinearLayoutManager和GridLayoutManager使用这种模式)
- 自定义Measure(StaggerLayoutManager在一定条件下会使用这种模式,不过这次不介绍)
下面所有的逻辑基于AutoMeasure模式:
Measure的一部分逻辑被委派给了LayoutManager,LayoutManager有自己的onMeasure方法来接收RecyclerView在这次测量中的MeasureSpec,同时LayoutManager还会记录RecycleView的MeasureSpec**供内部布局时使用(主要是为了测量ChildView)**。
如果RecylcerView本次测量基于的MeasureSpec模式在宽/高上都是EXACTLY, 即ParentView已经给RecyclerView指定了具体的尺寸,这种情况下,RecyclerView就遵照ParentView的指示,将自己的尺寸设置为指定的尺寸。在代码逻辑中的流程是这样的:
- RecyclerView在onMeasure中调用LayoutManager的onMeasure方法
- LayoutManager onMeasure的默认实现(Support库中的三个子LayoutManager均使用了默认的实现)会调用RecyclerView的defaultOnMeasure函数
- defaultOnMeasure会调用LayoutManager.chooseSize基于当前测量约束MeasureSpec,Padding以及MinimumWidth/Height得到一个合适的height/width
RecyclerView机制解析: Measure
最新推荐文章于 2024-05-02 18:03:39 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)