詳解RecyclerView的分割線

2021-07-26 23:29:08 字數 3228 閱讀 3799

1. 新增recyclerview分割線,繼承自recyclerview.itemdecoration

可實現3個方法

1. 方法執行的順序為:

getitemoffsets() 執行4次 –> ondraw() 執行1次 –> child view ondraw() 執行1次 –> ondrawover() 執行1次

通過log日誌可以看到

getitemoffsets

()position = 0

getitemoffsets

()position = 1

getitemoffsets

()position = 2

getitemoffsets

()position = 3

ondraw

()ondrawover

()

2. 方法的作用:

2.1 ondraw()

public void ondraw(canvas c, recyclerview parent, recyclerview.state state)
顧名思義,跟view的ondraw()方法一樣,分割線的繪製,這個方法中有熟悉的canvas物件,拿它來直接畫就行。但是畫的位置需要通過獲取recyclerview的item來確定。

比如在第乙個item的上面我要個20dp的分割線:

c.drawrect(childview.getleft(), childview.gettop() - 20dp, childview.getright(), childview.gettop(), mpaint);

childview就是這個第一項item,根據這個item的上下左右的位置來確定分割線的位置,從而繪製分割線。而item的位置首先是按照原始的排列,比如本例中的從上到下,依次排列,item中間沒有空隙。但是在getitemoffsets()方法中通過rect的設定來增加item的左上右下的padding值從而與其他item產生距離。

在上面方法的執行流程中可以看到,getitemoffsets()方法會首先執行多次,而在方法中設定的outrect左上右下的值每個item被onmeasure()測量方法間接呼叫 加在item的padding中,從而item之間會產生間隔。

然後呼叫分割線的ondraw()方法繪製

然後每個item的ondraw()方法呼叫

然後ondrawover()方法呼叫

由此可知,在分割線的ondraw()方法中繪製的內容可能會被item的ondraw()中繪製的內容擋住,而ondrawover()方法中繪製的內容會在最上層。

2.2 getitemoffsets()
public void getitemoffsets(rect outrect, view view, recyclerview parent, recyclerview.state state)
如上所講,在getitemoffsets()方法中通過rect的設定來增加item的左上右下的padding值。

outrect.set(0, 20dp, 0, 10dp);

就是在item頂部與底部分別在padding中加相應的值。

2.3 ondrawover()
public void ondrawover(canvas c, recyclerview parent, recyclerview.state state)
與ondraw()方法相同,只是執行的順序不同。

talk is cheap show me the code

功能描述:

1. 分為兩部分,第一部分是上面的一行行選項,第二部分是下面的提示,其中選項可以有乙個或多個,而提示只有乙個

2. 分割線主要體現在選項中,第乙個選項距頂部30dp,最後乙個選項距底部20dp,選項之間相距10dp。

mrecyclerview.additemdecoration(mdivideritemdecoration);

mdivideritemdecoration.setitemcount(3);

class divideritemdecoration extends recyclerview.itemdecoration

@override

public

void

ondraw(canvas c, recyclerview parent, recyclerview.state state)

mpaint.setcolor(getresources().getcolor(r.color.promote_limit_divider_color));

//獲取recyclerview中所有子項

int count = parent.getchildcount();

for (int i = 0; i < count; i++)

} else else

if (i == count - 2) else

if (i == count - 1) else }}

}@override

public

void

getitemoffsets(rect outrect, view view, recyclerview parent, recyclerview.state state)

//與上面的邏輯一樣

if (mitemcount == 2)

} else else

if (position == mitemcount - 2) else

if (position == mitemcount - 1) else }}

@override

public

void

ondrawover(canvas c, recyclerview parent, recyclerview.state state)

}

參考:

RecyclerView 快取機制詳解

recyclerview據官方的介紹,該控制項用於在有限的視窗中展示大量資料集,其實這樣功能的控制項我們並不陌生,例如 listview gridview。recyclerview可以用來代替傳統的listview,gridview,更加強大和靈活。recyclerview的使用網上有非常多案例,這...

RecyclerView頂部重新整理實現詳解

recyclerview頂部重新整理的實現通常都是在recyclerview外部再包裹一層布局。在這個外層布局中,還包含乙個自定義的view,作為頂部重新整理時的指示view。也就是說,外層布局中包含兩個child,乙個頂部重新整理view,乙個recyclerview,頂部重新整理view預設是隱...

RecyclerView詳解 自定義動畫

如果覺得自定義比較繁瑣,github上也有相關的動畫實現 接下來我們將一步步分析這個實現類,最後在它的基礎上修改預設的動畫效果。先來看defaultitemanimator中的幾個重要的方法 void runpendinganimations 當有動畫需要執行時呼叫。boolean isrunnin...