爲RecyclerView添加吸頂條目分組(ItemDecoration)

通過RecyclerView提供的ItemDecoration 實現不同組條目分隔開間距,並且在間距處繪製吸頂條目分組

ItemDecoration類主要是三個方法:

  1. public void onDraw()
    在Item內容繪製之前繪製,可以理解成爲Item繪製背景

  2. public void onDrawOver()
    在Item內容繪製之後繪製,在Item之上繪製,覆蓋在內容上

  3. 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();

        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章