美文网首页程序员
RecyclerView通用分割线

RecyclerView通用分割线

作者: 天堂守望者 | 来源:发表于2019-05-31 15:36 被阅读0次

    可自定义分割线的颜色 宽度   虚线  适用RecyclerView 的  GridLayoutManager  LinearLayoutManager 一行代码搞定

    代码拿走就能用   如果好用  别忘了点个赞 

    ```

    import android.graphics.Canvas;

    import android.graphics.Color;

    import android.graphics.DashPathEffect;

    import android.graphics.Paint;

    import android.graphics.Rect;

    import android.support.annotation.NonNull;

    import android.support.v7.widget.GridLayoutManager;

    import android.support.v7.widget.LinearLayoutManager;

    import android.support.v7.widget.RecyclerView;

    import android.util.Log;

    import android.view.View;

    /**

    * hukui  2019/5/21 8:30

    **/

    public class RcyclerItemDecoration extends RecyclerView.ItemDecoration {

        private int mDividerHeight = 1;//分割线高度,默认为1px

        private int mDividerColor = Color.parseColor("#8b8b8b");//分割线颜色

        private float dashWidth = 0;//虚线长度

        private float dashGap = 0;//虚线间隔长度

        private int spanCount;//每列的个数

        private int mMaxSpanGroupIndex;

        Paint paint;

        public RcyclerItemDecoration() {

            initDrawable();

    }

        public RcyclerItemDecoration(int mDividerHeight) {

            this.mDividerHeight = mDividerHeight;

            initDrawable();

    }

        public RcyclerItemDecoration(int mDividerHeight, int mDividerColor) {

            this.mDividerHeight = mDividerHeight;

            this.mDividerColor = mDividerColor;

            initDrawable();

    }

        public RcyclerItemDecoration(int mDividerHeight, int mDividerColor, float dashWidth, float dashGap) {

            this.mDividerHeight = mDividerHeight;

            this.mDividerColor = mDividerColor;

            this.dashWidth = dashWidth;

            this.dashGap = dashGap;

            initDrawable();

    }

        private void initDrawable() {

            paint = new Paint();

            paint.setColor(mDividerColor);

            paint.setStrokeWidth(mDividerHeight);

            paint.setStyle(Paint.Style.STROKE);

            paint.setAntiAlias(true);

            paint.setPathEffect(new DashPathEffect(new float[]{dashWidth, dashGap}, 0));

    }

        @Override

        public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {

            super.getItemOffsets(outRect, view, parent, state);

            //获取当前位置

            int position = parent.getChildAdapterPosition(view);

            view.setTag(position);

            RecyclerView.LayoutManager manager = parent.getLayoutManager();

            if (manager instanceof GridLayoutManager) {

                GridLayoutManager gridLayoutManager = (GridLayoutManager) parent.getLayoutManager();

                GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();

                //获取每列的个数

                spanCount = gridLayoutManager.getSpanCount();

                //获取最大的列数

                mMaxSpanGroupIndex = spanSizeLookup.getSpanGroupIndex(parent.getAdapter().getItemCount() - 1, spanCount);

                //获取当前列数

                int spanGroupIndex = spanSizeLookup.getSpanGroupIndex(position, spanCount);

                //当前列中占用的个数

                int spanSize = spanSizeLookup.getSpanSize(position);

                if (spanGroupIndex == mMaxSpanGroupIndex && spanGroupIndex != 0) {

                    if (spanSize < spanCount) {

                        outRect.right = mDividerHeight;

    }

                } else {

                    //view 没有占据一列 并不是当前列的第一个

                    if (spanSize < spanCount && spanSize != 0) {

                        outRect.left = mDividerHeight;

    }

    }

                if (spanGroupIndex != 0) {

                    outRect.top = mDividerHeight;

    }

            } else if (manager instanceof LinearLayoutManager) {

                LinearLayoutManager layoutManager = (LinearLayoutManager) manager;

                if (position != 0) {

                    if (layoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL) {

                        outRect.left = mDividerHeight;

                    } else {

                        outRect.top = mDividerHeight;

    }

    }

    }

    }

        @Override

        public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {

            super.onDraw(c, parent, state);

            RecyclerView.LayoutManager manager = parent.getLayoutManager();

            if (manager instanceof GridLayoutManager) {

                drawGrid(c, parent);

            } else if (manager instanceof LinearLayoutManager) {

                LinearLayoutManager layoutManager = (LinearLayoutManager) manager;

                if (layoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL) {

                    draHorizontal(c, parent);

                } else {

                    draVertical(c, parent);

    }

    }

    }

        private void drawGrid(Canvas c, RecyclerView parent) {

            GridLayoutManager gridLayoutManager = (GridLayoutManager) parent.getLayoutManager();

            int count = parent.getChildCount();

            GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();

            for (int i= 0; i< count; i++) {

                View view = parent.getChildAt(i);

                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();

                int position = (int) view.getTag();

                //获取当前列数

                int spanGroupIndex = spanSizeLookup.getSpanGroupIndex(position, spanCount);

                //当前列中的位置

                int spanSize = spanSizeLookup.getSpanIndex(position, spanCount);

                int left, top, right, bottom;

                if (spanGroupIndex == mMaxSpanGroupIndex && spanGroupIndex != 0) {

                    if (spanSize < spanCount) {

                        left= view.getRight();

                        right= left+ mDividerHeight - params.rightMargin;

                        top= view.getTop() - params.topMargin;

                        bottom= view.getBottom() + params.bottomMargin;

                        c.drawLine(left, top, right, bottom, paint);

    }

                } else {

                    //竖线  左边需要分割线,开始绘制

                    if (spanSize < spanCount && spanSize != 0) {

                        left= view.getLeft() - mDividerHeight - params.leftMargin;

                        right= left+ mDividerHeight;

                        top= view.getTop() - params.topMargin;

                        bottom= view.getBottom() + params.bottomMargin;

                        c.drawLine(left, top, right, bottom, paint);

    }

    }

                //画横线 最后一组不需要绘制

                if (spanGroupIndex < mMaxSpanGroupIndex) {

                    left= view.getLeft() + params.leftMargin;

                    right= left+ view.getMeasuredWidth() + params.rightMargin;

                    top= view.getBottom() + params.bottomMargin;

                    bottom= top+ mDividerHeight;

                    c.drawLine(left, top, right, bottom, paint);

    }

    }

    }

        //横向分割线

        private void draVertical(Canvas c, RecyclerView parent) {

            int count = parent.getChildCount();

            int left = parent.getPaddingLeft();

            int right = parent.getMeasuredWidth() - parent.getPaddingRight();

            for (int i= 0; i< count; i++) {

                View view = parent.getChildAt(i);

                int position = (int) view.getTag();

                if (position == 0) {

                    continue;

    }

                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();

                int top = view.getBottom() + layoutParams.bottomMargin;

                int bottom = top + mDividerHeight;

                c.drawLine(left, top, right, bottom, paint);

    }

    }

        //竖直分割线

        private void draHorizontal(Canvas c, RecyclerView parent) {

            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();

            int count = parent.getChildCount();

            int top = parent.getPaddingTop();

            int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom();

            for (int i= 0; i< count; i++) {

                View view = parent.getChildAt(i);

                int position = (int) view.getTag();

                if (position == layoutManager.getChildCount() - 1) {

                    continue;

    }

                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();

                int left = view.getRight() + layoutParams.rightMargin;

                int right = left + mDividerHeight;

                c.drawLine(left, top, right, bottom, paint);

    }

    }

    }

    ```

    相关文章

      网友评论

        本文标题:RecyclerView通用分割线

        本文链接:https://www.haomeiwen.com/subject/ziiuvttx.html