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

首頁 > 學院 > 開發設計 > 正文

RecyclerView源碼剖析

2019-11-09 15:35:24
字體:
來源:轉載
供稿:網友

RecyclerView源碼剖析

本人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中一層一層追蹤,方法中看到了這段代碼

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); }

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

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

insets的四個參數 這個我需要記錄下。當為添加此分割線時候,只有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());只設置了一個值。


快捷鍵

加粗 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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 化德县| 太和县| 临泉县| 龙游县| 定西市| 通榆县| 贡山| 新巴尔虎左旗| 邵阳市| 石楼县| 醴陵市| 东乡族自治县| 名山县| 晋州市| 黎川县| 正宁县| 福州市| 徐闻县| 广安市| 临湘市| 马鞍山市| 虹口区| 团风县| 丰县| 明星| 盈江县| 兴安县| 长子县| 盈江县| 锦州市| 扎囊县| 称多县| 全州县| 施秉县| 岳普湖县| 新余市| 新津县| 聂荣县| 洞口县| 锡林郭勒盟| 松潘县|