RecyclerView自定义分割线

RecyclerView自定义分割线

排列方式:

  1. 水平排列分割线
  2. 垂直排列分割线

设置属性:

  1. 是否最后一条显示分割线
  2. 设置分割线宽(高)度
  3. 设置左右间距
  4. 设置左间距
  5. 设置右间距
  6. 通过资源id设置左间距
  7. 设置颜色

设置属性代码:

/**
         * 是否最后一条显示分割线
         * @param show
         * @return
         */
        public Builder setmShowLastLine(boolean show) {
            this.mShowLastLine = show;
            return this;
        }

        /**
         * 设置分割线宽(高)度
         * @param pixels
         * @return
         */
        public Builder setSpan(float pixels) {
            mSpanSpace = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pixels, mResources.getDisplayMetrics());
            return this;
        }

        /**
         * 设置分割线宽(高)度
         * @param resource
         * @return
         */
        public Builder setSpan(@DimenRes int resource) {
            mSpanSpace = mResources.getDimensionPixelSize(resource);
            return this;
        }

        /**
         * 设置左右间距
         * @param pixels
         * @return
         */
        public Builder setPadding(float pixels) {
            setLeftPadding(pixels);
            setRightPadding(pixels);
            return this;
        }

        /**
         * 设置左右间距
         * @param resource
         * @return
         */
        public Builder setPadding(@DimenRes int resource) {
            setLeftPadding(resource);
            setRightPadding(resource);
            return this;
        }

        /**
         * 设置左间距
         * @param pixelPadding
         * @return
         */
        public Builder setLeftPadding(float pixelPadding) {
            mLeftPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pixelPadding, mResources.getDisplayMetrics());
            return this;
        }

        /**
         * 设置右间距
         * @param pixelPadding
         * @return
         */
        public Builder setRightPadding(float pixelPadding) {
            mRightPadding=(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pixelPadding, mResources.getDisplayMetrics());
            return this;
        }

        /**
         * 通过资源id设置左间距
         * @param resource
         * @return
         */
        public Builder setLeftPadding(@DimenRes int resource) {
            mLeftPadding = mResources.getDimensionPixelSize(resource);
            return this;
        }

        /**
         * 通过资源id设置左间距
         * @param resource
         * @return
         */
        public Builder setRightPadding(@DimenRes int resource) {
            mRightPadding = mResources.getDimensionPixelSize(resource);
            return this;
        }

        /**
         * 通过资源id设置颜色
         * @param resource
         * @return
         */
        @SuppressLint("ResourceType")
        public Builder setColorResource(@ColorRes int resource) {
            setColor(ContextCompat.getColor(mContext, resource));
            return this;
        }

        /**
         * 设置颜色
         * @param color
         * @return
         */
        public Builder setColor(@ColorRes int color) {
            mColor = color;
            return this;
        }

排列方式:

/**
     * 画水平排列分割线
     * @param c
     * @param parent
     */
    private void drawHorizontal(Canvas c, RecyclerView parent) {
        final int top=parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();
        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            final int left = child.getRight() + params.rightMargin + Math.round(ViewCompat.getTranslationX(child));
            final int right = left + mSpanSpace;
            int count = mShowLastLine ? parent.getAdapter().getItemCount() : parent.getAdapter().getItemCount() - 1;
            if (i < count) {
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            }
        }
    }

    /**
     * 画垂直排列分割线
     * @param c
     * @param parent
     */
    private void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft() + mLeftPadding;
        final int right = parent.getWidth() - parent.getPaddingRight() - mRightPadding;
        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params= (RecyclerView.LayoutParams) child.getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin + Math.round(ViewCompat.getTranslationY(child));
            final int bottom=top+mSpanSpace;
            int count = mShowLastLine ? parent.getAdapter().getItemCount() : parent.getAdapter().getItemCount() - 1;
            if (i < count) {
                mDivider.setBounds(left, top, right, bottom);
                mDivider.draw(c);
            } else {
                mDivider.setBounds(left,top,right,top);
                mDivider.draw(c);
            }
        }
    }

绘画分割线:

/**
     * item是否是垂直排列
     * @param parent
     * @return
     */
    private boolean isVertical(RecyclerView parent) {
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof LinearLayoutManager) {
            int orientation=((LinearLayoutManager)layoutManager).getOrientation();
            return orientation == LinearLayoutManager.VERTICAL;
        }
        return false;
    }

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

设置分割线:

LinearItemDecoration linearItemDecoration = new LinearItemDecoration.Builder(mContext)
                .setSpan(1f)
                .setColorResource(R.color.gray_selector)
                .setmShowLastLine(true)
                .build();
      
        recyclerView.addItemDecoration(linearItemDecoration);
       

完整代码:

链接:https://pan.baidu.com/s/1GH-oHsz9H4zQxXR6PE2FJw
提取码:hw0i
复制这段内容后打开百度网盘手机App,操作更方便哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值