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...