通過RecyclerView提供的ItemDecoration 實現不同組條目分隔開間距,並且在間距處繪製吸頂條目分組
ItemDecoration類主要是三個方法:
public void onDraw()
在Item內容繪製之前繪製,可以理解成爲Item繪製背景public void onDrawOver()
在Item內容繪製之後繪製,在Item之上繪製,覆蓋在內容上public void getItemOffsets()
給Item設置類似Margin效果(在Margin填充的區域點擊,ItemOnclickListener接受不到,因爲設置的時候只是給Item ContentView設置點擊事件)
吸頂Item具體實現
public class CeilingItemDecoration extends RecyclerView.ItemDecoration {
private final TextPaint textPaint; //繪製文字
private Paint mDividerPaint; //繪製組條目背景
private int sessionHeight=100;
private List<Integer> mList;
public void setList(List list) {
mList = list;
}
public CeilingItemDecoration() {
mDividerPaint = new Paint();
mDividerPaint.setColor(Color.GREEN);
textPaint = new TextPaint();
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
textPaint.setAntiAlias(true);
textPaint.setTextSize(80);
textPaint.setColor(Color.BLACK);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int position = parent.getChildAdapterPosition(view);
Integer i = mList.get(position);
if (i%10==0){
outRect.top=sessionHeight;
}else {
outRect.top=0;
}
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
int childCount = parent.getChildCount();
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int last=0;
for (int i = 0; i < childCount ; i++) {
View childAt = parent.getChildAt(i);
int position = parent.getChildAdapterPosition(childAt); //獲取實際邏輯的位置,而並非recyclerView 中顯示的第幾個條目
int num = mList.get(position);
num=num/10;
int max = Math.max(100, childAt.getBottom());
c.drawRect(left,childAt.getBottom()-max+last,right,childAt.getBottom()-max+100+last,mDividerPaint);
c.drawText(num+"",0,childAt.getBottom()-max+100+last,textPaint);
//判斷是否是一個組的最後一個條目,如果是,則記錄每個組最後一個條目的底部位置
if (i== childCount-1||mList.get(position)/10 ==mList.get(position+1)/10){
continue;
}
last = childAt.getBottom();
}
}
}