自定义网格和瀑布流布局的分割线RecyclerView.ItemDecoration

本文介绍了一个名为DividerGridItemDecoration的类,该类扩展了RecyclerView.ItemDecoration,用于实现自定义的网格和瀑布流布局的分割线。通过获取系统属性listDivider创建Drawable对象,并在onDraw方法中绘制水平和垂直分割线。类内部还包含了一些辅助方法,如检查是否为最后一列或最后一行,以避免在边界位置绘制分割线。
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration{
    private  final int[] ATTRS = new int[]{android.R.attr.listDivider};
    private Drawable drawable;
    public DividerGridItemDecoration(Context context){
        TypedArray typedArray = context.obtainStyledAttributes(ATTRS);
        drawable = typedArray.getDrawable(0);
        typedArray.recycle();
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        drawHorizontal(parent,c);
        drawVertical(parent,c);
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
    }
    private void drawVertical(RecyclerView parent,Canvas canvas){
        int childCount = parent.getChildCount();
        for(int i=0;i<childCount;i++){
            View view = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
            int top = view.getTop() - params.topMargin;
            int bottom = view.getBottom() + params.bottomMargin;
            int left = view.getRight() + params.rightMargin;
            int right = left + drawable.getIntrinsicWidth();
            drawable.setBounds(left,top,right,bottom);
            drawable.draw(canvas);
        }
    }
    private void drawHorizontal(RecyclerView parent,Canvas canvas){
        int childCount = parent.getChildCount();
        for(int i=0;i<childCount;i++){
            View view = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
            int left = view.getLeft() - params.leftMargin;
            int right = view.getRight() + params.rightMargin + drawable.getIntrinsicWidth();
            int top = view.getBottom() + params.bottomMargin;
            int bottom = top + drawable.getIntrinsicHeight();
            drawable.setBounds(left,top,right,bottom);
            drawable.draw(canvas);
        }
    }
    private int getSpanCount(RecyclerView parent){
        int spanCount = -1;
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if(layoutManager instanceof GridLayoutManager){
            spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
        }else if(layoutManager instanceof StaggeredGridLayoutManager){
            spanCount = ((StaggeredGridLayoutManager)layoutManager).getSpanCount();
        }
        return spanCount;
    }

    private boolean isLastColum(RecyclerView parent,int spanCount,int position,int childCount){
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if(layoutManager instanceof GridLayoutManager){
            if((position + 1)%spanCount == 0){
                return true;
            }
        }else if(layoutManager instanceof StaggeredGridLayoutManager){
            if(((StaggeredGridLayoutManager) layoutManager).getOrientation() == StaggeredGridLayoutManager.VERTICAL){
                if((position+1)%spanCount == 0){
                    return  true;
                }
            }else{
                childCount = childCount - childCount%spanCount;
                if(position >= childCount){
                    return  true;
                }
            }
        }
        return false;
    }

    private boolean isLastRow(RecyclerView parent,int childCount,int position,int spanCount){
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if(layoutManager instanceof GridLayoutManager){
            if(position >= (childCount - childCount%spanCount)){
                return  true;
            }
        }else if(layoutManager instanceof StaggeredGridLayoutManager){
            if(((StaggeredGridLayoutManager) layoutManager).getOrientation() == StaggeredGridLayoutManager.VERTICAL){
                if(position >= (childCount - childCount%spanCount)){
                    return  true;
                }
            }else{
                if((position + 1)%spanCount == 0){
                    return true;
                }
            }
        }
        return false;
    }


    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        int spanCount = getSpanCount(parent);
        int childCount = parent.getAdapter().getItemCount();
        int position = parent.getChildAdapterPosition(view);
        if(isLastColum(parent,spanCount,position,childCount)){
            outRect.set(0,0,0,drawable.getIntrinsicHeight());
        }else if(isLastRow(parent,childCount,position,spanCount)){
            outRect.set(0,0,drawable.getIntrinsicWidth(),0);
        }else{
            outRect.set(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值