为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();

        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值