DEVLOG 9.13 手写RecyclerView问题总结
在开发过程中遇到的若干问题集合:
RecyclerView手写的过程中为什么要增加clickable属性
RecyclerView 的TextView 没有显示出来 但是修改了布局文件从RelativeLayout到LinearLayout就可以了?WHY
LayoutInflater.inflate()几种重载和参数的区别
addView()

问题一:
RecyclerView手写的过程中为什么要增加clickable属性:
MyRecyclerView本身就是直接继承ViewGroup,在View和ViewGroup中clickable默认为false:

如果clickable为false,onTouchEvent不会被MyRecyclerView消费。

暂时不知道为什么,已经发了Stack Overflow,之后知道了结果再回来回答。
3. LayoutInflater.inflate重载方法:
LayoutInflater.inflate我们通常在RecyclerView和Fragment中从布局文件加载View。主要有两个参数和三个参数的方法。两个参数的方法会调用三个参数的inflate方法,并且将attach2root设置为true。

所以使用两个参数的方法,和设置第三个参数为true是等价的。

理解attach2Root
当attach2Root为false
我们一般在RecyclerView加载布局文件时,不会设置attach2root为true,这个时候resultView的rootView是自身的布局的根布局,也就是这个LinearLayout。返回的对象是LinearLayout这个ViewGroup。
当attach2Root为true
inflate会将子View添加到自身,并且最后会返回root。
当两个参数设置不同的时候,上述过程可以总结为下图:

这里尽量不要设置root为null,因为root会参与计算LayoutParams。

LayoutInflater.inflater什么时候设置attach2root为false?
总结一下,这里主要有两个场景,一个场景是使用RecyclerView和Fragment实例化View的时候。这两个场景都有一个共同性,就是实例化后的View需要交给ViewGroup来管理出现的时间,而不是直接添加到ViewGroup。

问题三:addView
addView是ViewGroup的方法。具体的参数含义和布局有关。

addView方法会依次调用requestLayout invalidate 和 addViewInner
在requestLayout中,View会寻找到自己的parentView,一直最终找到ViewRootImpl,然后找到ViewRootImpl的scheduleTraversals方法:
这里会post一个Runnable,这个Runnable之中包含了performTraversals,然后开始三大流程。
在addViewInner中也会调用child.requestLayout,因为childView可能也携带了一些参数。
但是在addViewInner中也会调用child.requestLayout,这样好像重复了。但是在注释中说,使在child.requestLayout之前调用requestLayout可以屏蔽子View再向上传递让父View重新layout的事件。所以当子View.requestLayout时,调用ViewGroup layout measure,然后 invalidate,最后再是子View layout measure draw。大概是这样~