DEVLOG 9.13 手寫RecyclerView問題總結(jié)
在開發(fā)過程中遇到的若干問題集合:
RecyclerView手寫的過程中為什么要增加clickable屬性
RecyclerView 的TextView 沒有顯示出來? 但是修改了布局文件從RelativeLayout到LinearLayout就可以了?WHY
?LayoutInflater.inflate()幾種重載和參數(shù)的區(qū)別
addView()

問題一:
RecyclerView手寫的過程中為什么要增加clickable屬性:
MyRecyclerView本身就是直接繼承ViewGroup,在View和ViewGroup中clickable默認為false:

如果clickable為false,onTouchEvent不會被MyRecyclerView消費。

暫時不知道為什么,已經(jīng)發(fā)了Stack Overflow,之后知道了結(jié)果再回來回答。
3. LayoutInflater.inflate重載方法:
LayoutInflater.inflate我們通常在RecyclerView和Fragment中從布局文件加載View。主要有兩個參數(shù)和三個參數(shù)的方法。兩個參數(shù)的方法會調(diào)用三個參數(shù)的inflate方法,并且將attach2root設(shè)置為true。

所以使用兩個參數(shù)的方法,和設(shè)置第三個參數(shù)為true是等價的。

理解attach2Root
當attach2Root為false
我們一般在RecyclerView加載布局文件時,不會設(shè)置attach2root為true,這個時候resultView的rootView是自身的布局的根布局,也就是這個LinearLayout。返回的對象是LinearLayout這個ViewGroup。
當attach2Root為true
inflate會將子View添加到自身,并且最后會返回root。
當兩個參數(shù)設(shè)置不同的時候,上述過程可以總結(jié)為下圖:

這里盡量不要設(shè)置root為null,因為root會參與計算LayoutParams。

LayoutInflater.inflater什么時候設(shè)置attach2root為false?
?總結(jié)一下,這里主要有兩個場景,一個場景是使用RecyclerView和Fragment實例化View的時候。這兩個場景都有一個共同性,就是實例化后的View需要交給ViewGroup來管理出現(xiàn)的時間,而不是直接添加到ViewGroup。

問題三:addView
addView是ViewGroup的方法。具體的參數(shù)含義和布局有關(guān)。

addView方法會依次調(diào)用requestLayout invalidate 和 addViewInner
在requestLayout中,View會尋找到自己的parentView,一直最終找到ViewRootImpl,然后找到ViewRootImpl的scheduleTraversals方法:
這里會post一個Runnable,這個Runnable之中包含了performTraversals,然后開始三大流程。
在addViewInner中也會調(diào)用child.requestLayout,因為childView可能也攜帶了一些參數(shù)。
但是在addViewInner中也會調(diào)用child.requestLayout,這樣好像重復了。但是在注釋中說,使在child.requestLayout之前調(diào)用requestLayout可以屏蔽子View再向上傳遞讓父View重新layout的事件。所以當子View.requestLayout時,調(diào)用ViewGroup layout measure,然后 invalidate,最后再是子View layout measure draw。大概是這樣~