【Android】【RecyclerView】各种LayoutManager划分割线

来源:互联网 发布:手机淘宝网 编辑:程序博客网 时间:2024/06/04 19:12

RecyClerView的各种分割线,List,Grid,Staggered,垂直和水平

1.LIST
这里写图片描述
这里写图片描述

public class ListDividerItemDecoration extends RecyclerView.ItemDecoration {    private int[] attrs = new int[]{            android.R.attr.listDivider    };    public static final int DIRECTION_VERTICAL = 0;    public static final int DIRECTION_HORIZONTAL = 1;    private Drawable divider;    private int direction;    public ListDividerItemDecoration(Context context, int direction) {        super();        TypedArray typedArray = context.obtainStyledAttributes(attrs);        divider = typedArray.getDrawable(0);        this.direction = direction;    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        super.onDraw(c, parent, state);        if (divider == null)            return;        if (direction == DIRECTION_VERTICAL) {            drawVerticalDivider(c, parent);        } else {            drawHoriziontalDivider(c, parent);        }    }    private void drawHoriziontalDivider(Canvas c, RecyclerView parent) {        int left = 0;        int top = 0;        int right =0;        int bottom = 0;        top = parent.getPaddingTop();        bottom = parent.getHeight() - parent.getPaddingBottom();        for (int i = 0; i < parent.getChildCount(); i++) {            View child = parent.getChildAt(i);            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();            left = child.getRight()+layoutParams.rightMargin;            right = left + divider.getIntrinsicWidth();            divider.setBounds(left, top, right, bottom);            divider.draw(c);        }    }    private void drawVerticalDivider(Canvas c, RecyclerView parent) {        int left = 0;        int top = 0;        int right =0;        int bottom = 0;        left = parent.getPaddingLeft();        right = parent.getWidth() - parent.getPaddingRight();        for (int i = 0; i < parent.getChildCount(); i++) {            View child = parent.getChildAt(i);            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();            top = child.getBottom()+layoutParams.bottomMargin;            bottom = top + divider.getIntrinsicHeight();            divider.setBounds(left, top, right, bottom);            divider.draw(c);        }    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        System.out.println("divider:" + divider.getIntrinsicHeight() + "  " + divider.getIntrinsicWidth());        int p = parent.getChildAdapterPosition(view);        int p1 = parent.getChildLayoutPosition(view);        System.out.println("p:" + p + " p1:" + p1);        if (direction == DIRECTION_VERTICAL) {            if (parent.getChildLayoutPosition(view) == 0) {                outRect.set(0, 0, 0, 0);            } else {                outRect.set(0, divider.getIntrinsicHeight(), 0, 0);            }        } else {            if (parent.getChildLayoutPosition(view) == 0) {                outRect.set(0, 0, 0, 0);            } else {                outRect.set(divider.getIntrinsicWidth(), 0, 0, 0);            }        }    }}

2.GRID
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

public class GridDividerItemDecoration extends RecyclerView.ItemDecoration {    private int[] attrs = new int[]{            android.R.attr.listDivider    };    public static final int DIRECTION_VERTICAL = 0;    public static final int DIRECTION_HORIZONTAL = 1;    private Drawable divider;    private int direction;    private final int column;    public GridDividerItemDecoration(Context context, int direction, int column) {        super();        TypedArray typedArray = context.obtainStyledAttributes(attrs);        divider = typedArray.getDrawable(0);        this.direction = direction;        this.column = column;    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        super.onDraw(c, parent, state);        if (divider == null)            return;        if (direction == DIRECTION_VERTICAL) {            drawVerticalDivider(c, parent);        } else {            drawHoriziontalDivider(c, parent);        }    }    private void drawHoriziontalDivider(Canvas c, RecyclerView parent) {        int left = 0;        int top = 0;        int right = 0;        int bottom = 0;        for (int i = 0; i < parent.getChildCount(); i++) {            View child = parent.getChildAt(i);            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();            //头部第一条线            if (i % column == 0) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = top + divider.getIntrinsicHeight();                left = child.getLeft() - layoutParams.leftMargin;                right = child.getRight() + layoutParams.rightMargin;                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //最右边的线            if (i >= parent.getChildCount() - column) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();                left = child.getRight() + layoutParams.rightMargin;                right = left + divider.getIntrinsicWidth();                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //最后一个补线//            if(i==parent.getChildCount()-1&&(i + 1) % column!=0){//                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();//                bottom = child.getBottom() + layoutParams.bottomMargin+divider.getIntrinsicHeight();//                left = child.getRight() + layoutParams.rightMargin;//                right = left + divider.getIntrinsicWidth();//                divider.setBounds(left, top, right, bottom);//                divider.draw(c);////            }            //左边的线            top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();            bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();            left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth();            right = left + divider.getIntrinsicWidth();            divider.setBounds(left, top, right, bottom);            divider.draw(c);            //下面的线            top = child.getBottom() + layoutParams.bottomMargin;            bottom = top + divider.getIntrinsicHeight();            left = child.getLeft() - layoutParams.leftMargin;            right = child.getRight() + layoutParams.rightMargin;            divider.setBounds(left, top, right, bottom);            divider.draw(c);        }    }    private void drawVerticalDivider(Canvas c, RecyclerView parent) {        int left = 0;        int top = 0;        int right = 0;        int bottom = 0;        for (int i = 0; i < parent.getChildCount(); i++) {            View child = parent.getChildAt(i);            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();            //头部第一条线            if (i / column == 0) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = top + divider.getIntrinsicHeight();                left = child.getLeft() - layoutParams.leftMargin;                right = child.getRight() + layoutParams.rightMargin;                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //最右边的线            if ((i + 1) % column == 0) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();                left = child.getRight() + layoutParams.rightMargin;                right = left + divider.getIntrinsicWidth();                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //最后一个补线            if (i == parent.getChildCount() - 1 && (i + 1) % column != 0) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();                left = child.getRight() + layoutParams.rightMargin;                right = left + divider.getIntrinsicWidth();                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //左边的线            top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();            bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();            left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth();            right = left + divider.getIntrinsicWidth();            divider.setBounds(left, top, right, bottom);            divider.draw(c);            //下面的线            top = child.getBottom() + layoutParams.bottomMargin;            bottom = top + divider.getIntrinsicHeight();            left = child.getLeft() - layoutParams.leftMargin;            right = child.getRight() + layoutParams.rightMargin;            divider.setBounds(left, top, right, bottom);            divider.draw(c);        }    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        System.out.println("divider:" + divider.getIntrinsicHeight() + "  " + divider.getIntrinsicWidth());        int p = parent.getChildAdapterPosition(view);        int p1 = parent.getChildLayoutPosition(view);        int left = 0;        int top = 0;        int right = 0;        int bottom = 0;        System.out.println("p:" + p + " p1:" + p1);        if (direction == DIRECTION_VERTICAL) {            int position = parent.getChildLayoutPosition(view);            if (position / column == 0)                top = divider.getIntrinsicHeight();            if ((position + 1) % column == 0)                right = divider.getIntrinsicWidth();            left = divider.getIntrinsicWidth();            bottom = divider.getIntrinsicHeight();            outRect.set(left, top, right, bottom);        } else {            int position = parent.getChildLayoutPosition(view);            if (position / column == 0)                left = divider.getIntrinsicWidth();            if (position % column == 0)                top = divider.getIntrinsicHeight();            right = divider.getIntrinsicWidth();            bottom = divider.getIntrinsicHeight();            outRect.set(left, top, right, bottom);        }    }}

3. STAGGERED
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

public class StaggeredDividerItemDecoration extends RecyclerView.ItemDecoration {    private int[] attrs = new int[]{            android.R.attr.listDivider    };    public static final int DIRECTION_VERTICAL = 0;    public static final int DIRECTION_HORIZONTAL = 1;    private Drawable divider;    private int direction;    private final int column;    public StaggeredDividerItemDecoration(Context context, int direction, int column) {        super();        TypedArray typedArray = context.obtainStyledAttributes(attrs);        divider = typedArray.getDrawable(0);        this.direction = direction;        this.column = column;    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        System.out.println("onDraw" + state.toString());        super.onDraw(c, parent, state);        if (divider == null)            return;        if (direction == DIRECTION_VERTICAL) {            drawVerticalDivider(c, parent);        } else {            drawHoriziontalDivider(c, parent);        }    }    private void drawHoriziontalDivider(Canvas c, RecyclerView parent) {        int left = 0;        int top = 0;        int right = 0;        int bottom = 0;        for (int i = 0; i < parent.getChildCount(); i++) {            View child = parent.getChildAt(i);            int position = ((StaggeredGridLayoutManager.LayoutParams) child.getLayoutParams()).getSpanIndex();            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();            //头部第一条线            if (position == 0) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = top + divider.getIntrinsicHeight();                left = child.getLeft() - layoutParams.leftMargin;                right = child.getRight() + layoutParams.rightMargin;                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //最右边的线            if (i >= parent.getChildCount() - column) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();                left = child.getRight() + layoutParams.rightMargin;                right = left + divider.getIntrinsicWidth();                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //最后一个补线            if(i>=parent.getChildCount()-column&&position!=0){                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = top + divider.getIntrinsicHeight();                left = child.getLeft() - layoutParams.leftMargin;                right = child.getRight() + layoutParams.rightMargin;                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //左边的线            top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();            bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();            left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth();            right = left + divider.getIntrinsicWidth();            divider.setBounds(left, top, right, bottom);            divider.draw(c);            //下面的线            top = child.getBottom() + layoutParams.bottomMargin;            bottom = top + divider.getIntrinsicHeight();            left = child.getLeft() - layoutParams.leftMargin;            right = child.getRight() + layoutParams.rightMargin;            divider.setBounds(left, top, right, bottom);            divider.draw(c);        }    }    private void drawVerticalDivider(Canvas c, RecyclerView parent) {        int left = 0;        int top = 0;        int right = 0;        int bottom = 0;        for (int i = 0; i < parent.getChildCount(); i++) {            View child = parent.getChildAt(i);            RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();            int position = ((StaggeredGridLayoutManager.LayoutParams) child.getLayoutParams()).getSpanIndex();            //头部第一条线            if (i / column == 0) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = top + divider.getIntrinsicHeight();                left = child.getLeft() - layoutParams.leftMargin;                right = child.getRight() + layoutParams.rightMargin;                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //最右边的线            if (position == column - 1) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();                left = child.getRight() + layoutParams.rightMargin;                right = left + divider.getIntrinsicWidth();                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //最后一个补线            if (i>=parent.getChildCount()-column&&position!=2) {                top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();                bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();                left = child.getRight() + layoutParams.rightMargin;                right = left + divider.getIntrinsicWidth();                divider.setBounds(left, top, right, bottom);                divider.draw(c);            }            //左边的线            top = child.getTop() - layoutParams.topMargin - divider.getIntrinsicHeight();            bottom = child.getBottom() + layoutParams.bottomMargin + divider.getIntrinsicHeight();            left = child.getLeft() - layoutParams.leftMargin - divider.getIntrinsicWidth();            right = left + divider.getIntrinsicWidth();            divider.setBounds(left, top, right, bottom);            divider.draw(c);            //下面的线            top = child.getBottom() + layoutParams.bottomMargin;            bottom = top + divider.getIntrinsicHeight();            left = child.getLeft() - layoutParams.leftMargin;            right = child.getRight() + layoutParams.rightMargin;            divider.setBounds(left, top, right, bottom);            divider.draw(c);        }    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        final StaggeredGridLayoutManager.LayoutParams slp = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();        int p2 = slp.getSpanIndex();        System.out.println("p2:" + p2);        System.out.println("divider:" + divider.getIntrinsicHeight() + "  " + divider.getIntrinsicWidth());        int p = parent.getChildAdapterPosition(view);        int p1 = parent.getChildLayoutPosition(view);        int left = 0;        int top = 0;        int right = 0;        int bottom = 0;        System.out.println("p:" + p + " p1:" + p1 + state.toString());        if (direction == DIRECTION_VERTICAL) {            int position = parent.getChildLayoutPosition(view);            if (position / column == 0)                top = divider.getIntrinsicHeight();            if (p2 == column - 1) {                right = divider.getIntrinsicWidth();                System.out.println("p:p:p" + p);            }            left = divider.getIntrinsicWidth();            bottom = divider.getIntrinsicHeight();            outRect.set(left, top, right, bottom);        } else {            int position = parent.getChildLayoutPosition(view);            if (position / column == 0)                left = divider.getIntrinsicWidth();            if (p2 == 0)                top = divider.getIntrinsicHeight();            right = divider.getIntrinsicWidth();            bottom = divider.getIntrinsicHeight();            outRect.set(left, top, right, bottom);        }    }}

代码不难,Copy即可用

1 0
原创粉丝点击