本人Android菜鳥一枚,很多沒寫博客了。言歸正傳,RecyclerView平時開發中用的比較多,打算試著剖析它的源碼,因為白天上班,水平有限,但是堅持每天剖析更新一些,記錄在博客上,歡迎指正交流。
前言 RecyclerView繼承于ViewGroup,那么萬變不離其中,主要的還是onMeasure、onLayout方法。onMeasure測量以及決定RecyclerView的大小,onLayout方法而是將Adapter中的Child(子View)以合適的坐標進行布局排列。
onMeasure todo
onLayout 此方法將Adapter
中的Child
(子View)以合適的方法進行布局排列。RecyclerView
作為一個大量數據集合的容器展示控件,那么還是一樣,我們猜想其中的每個Child
都需要調用View.layout(left,top,right,bottom)
方法對Child進行按照正確的坐標進行布局擺放。在onLayout中一層一層追蹤,方法中看到了這段代碼
其中的參數我解釋下。 child:即將展示在RecyclerView中的子view。 left:RecyclerView左邊邊緣的坐標,為相對坐標。注意是邊緣坐標。這個坐標是測量之后的出來的。注意:在此坐標中包括了Margin以及裝飾物的布局大小。 insets:裝飾物的布局參數,比如我們平時通過以下代碼來添加分割線,這里就是每條分割線的布局參數。
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST)); 這個我需要記錄下。當為添加此分割線時候,只有bottom的值為1,其余全為0,這個1px就是分割線的高度。其實也就順帶出了
DividerItemDecoration
中這段代碼的作用。
這也就是為什么這段的outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
只設置了一個值。
Ctrl + B
斜體 Ctrl + I
引用 Ctrl + Q
插入鏈接 Ctrl + L
插入代碼 Ctrl + K
插入圖片 Ctrl + G
提升標題 Ctrl + H
有序列表 Ctrl + O
無序列表 Ctrl + U
橫線 Ctrl + R
撤銷 Ctrl + Z
重做 Ctrl + Y
代碼塊語法遵循標準markdown代碼,例如:
@requires_authorizationdef somefunc(param1='', param2=0): '''A docstring''' if param1 > param2: # interesting新聞熱點
疑難解答