ItemDecoration直譯“條目裝飾品”,顧名思義,其主要用于給RecyclerView的每條item添加裝飾,可以理解為分割線,但是決不僅限于分割線,實際上比分割線會的多。
RecyclerView沒有提供divide屬性,為RecyclerView添加分割線需要使用RecyclerView的addItemDecoration方法。這里主要寫ItemDecoration的自定義方法。
RecyclerView有三個重寫方法,分別是getItemOffsets,onDraw和onDrawOver。其中getItemOffsets主要用于在ItemView(Item的實際視圖)四周撐開空間;onDraw主要用于在ItemView下方進行繪制;onDrawOver主要用于在ItemView上方進行繪制。
getItemOffsets(Rect outRect,View view,RecyclerView parent,RecyclerView.State state):此方法作用于每個ItemView,使用時直接分別用outRect.top=x、outRect.bottom=x、outRect.left=x、outRect.right=x在ItemView的上下左右方向撐出x像素的空間,效果類似于給每個Item的視圖添加了padding值,視圖向中間收縮。此方法直接對每個Item生效,參數(shù)中的view為當前Item的視圖,只需處理特殊項,無需遍歷。(如首項尾項可能分別不需要上分割線和下分割線,此時無需為他們撐開上下空間。需要注意的是被撐開的空間屬于當前Item,并不是獨立的視圖)
onDraw(Canvas c,RecyclerView parent,RecyclerView.State state):此方法用于在Item視圖的下層空間進行繪制,直接用Canvas進行繪制即可,注意這個方法中繪制的內容顯示在Item的視圖下層,因此可能被Item的視圖遮擋住,所以一定要在getItemOffsets方法撐開的空白區(qū)域內進行繪制。這個方法的參數(shù)中并沒有提供每個Item的視圖,所以為每個Item繪制時要通過遍歷拿到要繪制的Item的視圖,根據(jù)視圖的位置確定Decoration的繪制位置。
onDrawOver(Canvas c,RecyclerView parent,RecyclerView.State state):此方法用于在Item視圖的上層空間進行繪制,使用方法和onDraw方法相同,不同的是由于此方法繪制的內容在顯示在Item的視圖上層,因此可能會遮擋Item的視圖內容。所以使用時一定要把內容繪制在正確的位置上,不要遮擋了界面上的有效內容。