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-04-21 13:44:38 发布
本文详细解析了RecyclerView的测量机制,特别是AutoMeasure模式下,如何根据LayoutManager的onMeasure方法、MeasureSpec以及ChildView的测量来确定RecyclerView的尺寸。当ParentView为RecyclerView指定具体尺寸时,RecyclerView会遵循这些尺寸;否则,将在布局完成后确定尺寸。在测量ChildView时,会考虑ItemDecorInset、RecyclerView的MeasureSpec、ChildView的Margin等因素,并通过getChildMeasureSpec生成适合的测量约束。最后,通过setMeasuredDimensionFromChildren确定RecyclerView的最终尺寸。
摘要由CSDN通过智能技术生成