安卓RecyclerView万能分割线

来源:互联网 发布:淘宝一键代购 编辑:程序博客网 时间:2024/05/16 13:06

参考后修改的,参考源暂时找不到了,非常感谢大神当年的帮助。
RecyclerView 的分割线可以通过item 布局去画,但是这样效率太低了,想在百度上找一篇用着舒爽的文章又太难了。
下面请看懒人分享第二章:万能分割线。

 //使用方法://参数分别是 上下文、宽度、颜色 rvMy.addItemDecoration(         new DividerItemDecoration(             getMyActivity(), 3, 0xffdddddd)             );*****************************************************************//自定义分割public class DividerItemDecoration extends BaseDividerItemDecoration {public DividerItemDecoration(Context context,    int  lineWidthDp, @ColorInt int colorRGB) {        super(context, lineWidthDp, colorRGB);    }    @Override    public boolean[] getItemSidesIsHaveOffsets(int itemPosition) {        //顺时针顺序:left, top, right, bottom        boolean[] isOffset = {false, false, true, true};        //默认只有bottom显示分割线        return isOffset;    }}//工具代码*******************************************************************package com.xdx.hostay.customer;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.support.annotation.ColorInt;import android.support.v7.widget.RecyclerView;import android.view.View;/** * Created by biyunlong on 2017/5/17. * Make progress every day */public abstract class BaseDividerItemDecoration extends RecyclerView.ItemDecoration {    private Paint mPaint;    private int lineWidth;//px 分割线宽    /**     * A single color value in the form 0xAARRGGBB.     **/    private int colorRGB;    public BaseDividerItemDecoration(Context context, float lineWidthDp, @ColorInt int colorRGB) {        this.colorRGB = colorRGB;//        this.lineWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, lineWidthDp, context.getResources().getDisplayMetrics());        this.lineWidth= (int) lineWidthDp;        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setColor(colorRGB);        mPaint.setStyle(Paint.Style.FILL);    }    public BaseDividerItemDecoration(Context context, int lineWidthDp, @ColorInt int colorRGB) {        this.colorRGB = colorRGB;        this.lineWidth= lineWidthDp;        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        mPaint.setColor(colorRGB);        mPaint.setStyle(Paint.Style.FILL);    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        int childCount1 = parent.getChildCount();        for (int i = 0; i < childCount1; i++) {            View child = parent.getChildAt(i);            int itemPosition = ((RecyclerView.LayoutParams) child.getLayoutParams()).getViewLayoutPosition();            boolean[] sideOffsetBooleans = getItemSidesIsHaveOffsets(itemPosition);            if (sideOffsetBooleans[0]) {                drawChildLeftVertical(child, c, parent);            }            if (sideOffsetBooleans[1]) {                drawChildTopHorizontal(child, c, parent);            }            if (sideOffsetBooleans[2]) {                drawChildRightVertical(child, c, parent);            }            if (sideOffsetBooleans[3]) {                drawChildBottomHorizontal(child, c, parent);            }        }    }    private void drawChildBottomHorizontal(View child, Canvas c, RecyclerView parent) {        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                .getLayoutParams();        int left = child.getLeft() - params.leftMargin - lineWidth;        int right = child.getRight() + params.rightMargin + lineWidth;        int top = child.getBottom() + params.bottomMargin;        int bottom = top + lineWidth;        c.drawRect(left, top, right, bottom, mPaint);    }    private void drawChildTopHorizontal(View child, Canvas c, RecyclerView parent) {        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                .getLayoutParams();        int left = child.getLeft() - params.leftMargin - lineWidth;        int right = child.getRight() + params.rightMargin + lineWidth;        int bottom = child.getTop() - params.topMargin;        int top = bottom - lineWidth;        c.drawRect(left, top, right, bottom, mPaint);    }    private void drawChildLeftVertical(View child, Canvas c, RecyclerView parent) {        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                .getLayoutParams();        int top = child.getTop() - params.topMargin - lineWidth;        int bottom = child.getBottom() + params.bottomMargin + lineWidth;        int right = child.getLeft() - params.leftMargin;        int left = right - lineWidth;        c.drawRect(left, top, right, bottom, mPaint);    }    private void drawChildRightVertical(View child, Canvas c, RecyclerView parent) {        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child                .getLayoutParams();        int top = child.getTop() - params.topMargin - lineWidth;        int bottom = child.getBottom() + params.bottomMargin + lineWidth;        int left = child.getRight() + params.rightMargin;        int right = left + lineWidth;        c.drawRect(left, top, right, bottom, mPaint);    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        //outRect 看源码可知这里只是把Rect类型的outRect作为一个封装了left,right,top,bottom的数据结构,        //作为传递left,right,top,bottom的偏移值来用的        int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();        //        boolean[] sideOffsetBooleans = getItemSidesIsHaveOffsets(itemPosition);        int left = sideOffsetBooleans[0] ? lineWidth : 0;        int top = sideOffsetBooleans[1] ? lineWidth : 0;        int right = sideOffsetBooleans[2] ? lineWidth : 0;        int bottom = sideOffsetBooleans[3] ? lineWidth : 0;        outRect.set(left, top, right, bottom);    }    /**     * 顺序:left, top, right, bottom     *     * @return boolean[4]     */    public abstract boolean[] getItemSidesIsHaveOffsets(int itemPosition);}
原创粉丝点击