国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 璧山县| 焉耆| 郓城县| 商水县| 梁山县| 大城县| 察雅县| 云林县| 淮安市| 呼伦贝尔市| 新野县| 通辽市| 出国| 建德市| 普兰县| 济南市| 安西县| 宝坻区| 互助| 浙江省| 白城市| 太仆寺旗| 古丈县| 漳州市| 新巴尔虎右旗| 红安县| 射阳县| 桂林市| 呼和浩特市| 手游| 鞍山市| 霞浦县| 个旧市| 商丘市| 衡东县| 塔城市| 临猗县| 嘉黎县| 卫辉市| 焉耆| 新源县|