但是以上兩種方式onDrawOver()方法實現邏輯對初次查看該段代碼要花時間理解。下面代碼邏輯(原理一樣,同樣參考大神代碼)相對清晰,易理解
public class StickyDecoration extends RecyclerView.ItemDecoration {
......
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View view = parent.getChildAt(i);
int index = parent.getChildAdapterPosition(view);
if (mCallback != null) {
GroupInfo groupinfo = mCallback.getGroupInfo(index);
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
//屏幕上第一個可見的 ItemView 時,i == 0;
if (i != 0) {
//只有組內的第一個ItemView之上才繪制
if (groupinfo.isFirstViewInGroup()) {
int top = view.getTop() - mHeaderHeight;
int bottom = view.getTop();
drawHeaderRect(c, groupinfo, left, top, right, bottom);
}
} else {
//當 ItemView 是屏幕上第一個可見的View 時,不管它是不是組內第一個View
//它都需要繪制它對應的 StickyHeader。
// 還要判斷當前的 ItemView 是不是它組內的最后一個 View
int top = parent.getPaddingTop();
if (groupinfo.isLastViewInGroup()) {
int suggestTop = view.getBottom() - mHeaderHeight;
// 當 ItemView 與 Header 底部平齊的時候,判斷 Header 的頂部是否小於
// parent 頂部內容開始的位置,如果小於則對 Header.top 進行位置更新,
//否則將繼續保持吸附在 parent 的頂部
if (suggestTop < top) {
top = suggestTop;
}
}
int bottom = top + mHeaderHeight;
drawHeaderRect(c, groupinfo, left, top, right, bottom);
}
}
}
}
private void drawHeaderRect(Canvas c, GroupInfo groupinfo, int left, int top, int right, int bottom) {
//繪制Header
c.drawRect(left, top, right, bottom, mPaint);
float titleX = left + mTextOffsetX;
float titleY = bottom - mFontMetrics.descent;
//繪制Title
c.drawText(groupinfo.getTitle(), titleX, titleY, mTextPaint);
}
}
3,不同item type結合ItemDecoration 實現(業務解耦,插即用的)
---------------------