国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 镇赉县| 贡觉县| 廊坊市| 象山县| 万山特区| 庆城县| 西藏| 昌黎县| 曲靖市| 措美县| 中牟县| 龙胜| 万安县| 汶上县| 屯留县| 吉木萨尔县| 万年县| 溧水县| 迭部县| 盐亭县| 永昌县| 云龙县| 蕲春县| 手机| 长春市| 荥阳市| 尼木县| 邢台市| 鞍山市| 宜兴市| 珲春市| 安阳市| 封开县| 濮阳县| 福安市| 邯郸县| 湟源县| 岗巴县| 华坪县| 策勒县| 双江|