国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

RecyclerView源碼剖析

2019-11-09 14:26:53
字體:
供稿:網(wǎng)友

RecyclerView源碼剖析

本人Android菜鳥一枚,很多沒寫博客了。言歸正傳,RecyclerView平時開發(fā)中用的比較多,打算試著剖析它的源碼,因為白天上班,水平有限,但是堅持每天剖析更新一些,記錄在博客上,歡迎指正交流。

前言 RecyclerView繼承于ViewGroup,那么萬變不離其中,主要的還是onMeasure、onLayout方法。onMeasure測量以及決定RecyclerView的大小,onLayout方法而是將Adapter中的Child(子View)以合適的坐標(biāo)進(jìn)行布局排列。

onMeasure todo

onLayout 此方法將Adapter中的Child(子View)以合適的方法進(jìn)行布局排列。RecyclerView作為一個大量數(shù)據(jù)集合的容器展示控件,那么還是一樣,我們猜想其中的每個Child都需要調(diào)用View.layout(left,top,right,bottom)方法對Child進(jìn)行按照正確的坐標(biāo)進(jìn)行布局?jǐn)[放。在onLayout中一層一層追蹤,方法中看到了這段代碼

public void layoutDecoratedWithMargins(View child, int left, int top, int right, int bottom) { final LayoutParams lp = (LayoutParams) child.getLayoutParams(); final Rect insets = lp.mDecorInsets; child.layout(left + insets.left + lp.leftMargin, top + insets.top + lp.topMargin, right - insets.right - lp.rightMargin, bottom - insets.bottom - lp.bottomMargin); }

其中的參數(shù)我解釋下。 child:即將展示在RecyclerView中的子view。 left:RecyclerView左邊邊緣的坐標(biāo),為相對坐標(biāo)。注意是邊緣坐標(biāo)。這個坐標(biāo)是測量之后的出來的。注意:在此坐標(biāo)中包括了Margin以及裝飾物的布局大小。 insets:裝飾物的布局參數(shù),比如我們平時通過以下代碼來添加分割線,這里就是每條分割線的布局參數(shù)。

mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));

insets的四個參數(shù) 這個我需要記錄下。當(dāng)為添加此分割線時候,只有bottom的值為1,其余全為0,這個1px就是分割線的高度。其實也就順帶出了DividerItemDecoration中這段代碼的作用。

@Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } }

這也就是為什么這段的outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());只設(shè)置了一個值。


快捷鍵

加粗 Ctrl + B 斜體 Ctrl + I 引用 Ctrl + Q插入鏈接 Ctrl + L插入代碼 Ctrl + K插入圖片 Ctrl + G提升標(biāo)題 Ctrl + H有序列表 Ctrl + O無序列表 Ctrl + U橫線 Ctrl + R撤銷 Ctrl + Z重做 Ctrl + Y

代碼塊

代碼塊語法遵循標(biāo)準(zhǔn)markdown代碼,例如:

@requires_authorizationdef somefunc(param1='', param2=0): '''A docstring''' if param1 > param2: # interesting
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 竹溪县| 乾安县| 邛崃市| 甘南县| 邢台市| 石屏县| 六枝特区| 吉木乃县| 南宁市| 新化县| 普定县| 邢台县| 桂平市| 南陵县| 芦溪县| 化州市| 普安县| 阳山县| 临沭县| 文水县| 习水县| 辽中县| 遵义市| 合水县| 诸城市| 清涧县| 大埔县| 甘德县| 恩平市| 化德县| 北安市| 恭城| 昌吉市| 曲沃县| 读书| 罗田县| 梁平县| 论坛| 临西县| 汽车| 时尚|