Android RecyclerView 如何针对不同的Position设置分隔线高度

美工的想法必须满足她,废话少说直接上代码

 public class SpaceItemDecoration extends RecyclerView.ItemDecoration{

        private static final java.lang.String TAG = "SpaceItemDecoration";
        private int mSpanCount;
        private int mSpace;
        private Paint mPaint;
        private int mMaxSpanGroupIndex;

        /**
         * 获取Item的偏移量
         * @param outRect
         * @param view
         * @param parent
         * @param state
         */
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
            super.getItemOffsets(outRect, view, parent, state);
            // 获取位置
            int position = parent.getChildAdapterPosition(view);
            view.setTag(position);

            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
            if(layoutManager instanceof GridLayoutManager) {
                GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
                GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
                mSpanCount =  gridLayoutManager.getSpanCount();
                mMaxSpanGroupIndex = spanSizeLookup.getSpanGroupIndex(parent.getAdapter().getItemCount() - 1, mSpanCount);
                int spanSize = spanSizeLookup.getSpanSize(position);
                int spanIndex = spanSizeLookup.getSpanIndex(position, mSpanCount);
                int spanGroupIndex = spanSizeLookup.getSpanGroupIndex(position, mSpanCount);
                if (spanSize <mSpanCount && spanIndex != 0) {
                    // 左边需要偏移
                    outRect.left = mSpace;
                }
                if(spanGroupIndex != 0) {
                    outRect.top = mSpace;
                }
            }else if(layoutManager instanceof LinearLayoutManager){
                LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
                if(position != 0) {
                    if (linearLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL) {
                        outRect.left = mSpace;
                    } else {
                        if(position==1){
                            outRect.top = mSpace*2;
                        }else {
                            outRect.top = mSpace;
                        }
                    }
                }
            }
        }

        public SpaceItemDecoration(int space, int spaceColor) {
            this.mSpace = space;
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setColor(spaceColor);
            mPaint.setStyle(Paint.Style.FILL);
        }

        /**
         * 绘制分割线
         * @param c
         * @param parent
         * @param state
         */
        @Override
        public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
            super.onDraw(c, parent, state);
            RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
            if(layoutManager instanceof GridLayoutManager) {
                drawSpace(c, parent);
            }else if(layoutManager instanceof LinearLayoutManager){
                LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
                if(linearLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL){
                    // 画竖直分割线
                    drawVertical(c,parent);
                }else{
                    // 画横向分割线
                    drawHorizontal(c,parent);
                }
            }
        }

        private void drawHorizontal(Canvas c, RecyclerView parent) {
            // 画竖直分割线
            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) parent.getLayoutManager();
            int top,bottom,left,right;
            for(int i=0;i<parent.getChildCount();i++){
                View child = parent.getChildAt(i);
                int position = (int) child.getTag();
                // 判断是否位于边缘
                if(position == linearLayoutManager.getItemCount()-1) continue;
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                top = child.getBottom()+layoutParams.bottomMargin;
                bottom = top + mSpace*2;
                left = child.getLeft() - layoutParams.leftMargin;
                right = child.getRight() + layoutParams.rightMargin;
                c.drawRect(left,top,right,bottom,mPaint);
            }
        }

        private void drawVertical(Canvas c, RecyclerView parent) {
            // 画竖直分割线
            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) parent.getLayoutManager();
            int top,bottom,left,right;
            for(int i=0;i<parent.getChildCount();i++){
                View child = parent.getChildAt(i);
                int position = (int) child.getTag();
                // 判断是否位于边缘
                if(position == 0) continue;
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                top = child.getTop()-layoutParams.topMargin;
                bottom = child.getBottom()+layoutParams.bottomMargin;
                left = child.getLeft() - layoutParams.leftMargin - mSpace;
                right = left + mSpace;
                c.drawRect(left,top,right,bottom,mPaint);
            }
        }

        /**
         * 绘制分割线
         * @param canvas
         * @param parent
         */
        private void drawSpace(Canvas canvas, RecyclerView parent) {
            GridLayoutManager gridLayoutManager = (GridLayoutManager) parent.getLayoutManager();
            int spanCount = gridLayoutManager.getSpanCount();
            GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
            int childCount = parent.getChildCount();
            int top,bottom,left,right;
            for(int i=0;i<childCount;i++){
                // 绘制思路,以绘制bottom和left为主,top和right不绘制,需要判断出当前的item是否位于边缘,位于边缘的item不绘制bottom和left,你懂得
                View child = parent.getChildAt(i);
                int position = (int) child.getTag();
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();

                int spanGroupIndex = spanSizeLookup.getSpanGroupIndex(position, spanCount);
                int spanSize = spanSizeLookup.getSpanSize(position);
                int spanIndex = spanSizeLookup.getSpanIndex(position, spanCount);
                // 画bottom分割线,如果没到达底部,绘制bottom
                if(spanGroupIndex < mMaxSpanGroupIndex) {
                    top = child.getBottom() + layoutParams.bottomMargin;
                    bottom = top + mSpace;
                    left = child.getLeft() - layoutParams.leftMargin; // 不需要外边缘
                    right = child.getRight() + layoutParams.rightMargin + mSpace;
                    canvas.drawRect(left, top, right, bottom, mPaint);
                }
                // 画left分割线
                if (spanSize != mSpanCount && spanIndex!=0) {
                    // 左边需要分割线,开始绘制
                    top = child.getTop() - layoutParams.topMargin;
                    bottom = child.getBottom() + layoutParams.bottomMargin;
                    left = child.getLeft() - layoutParams.leftMargin - mSpace;
                    right = left + mSpace;
                    canvas.drawRect(left, top, right, bottom, mPaint);
                }
            }
        }
    }

看到这么多代码有点晕,好吧我来点出关键点

1.getItemOffsets方法

if(position != 0) {
   if (linearLayoutManager.getOrientation() == LinearLayoutManager.HORIZONTAL) {
       outRect.left = mSpace;
   } else {
        if(position==1){
            outRect.top = mSpace*2;//第一行设置为其它两倍高度
        }else {
            outRect.top = mSpace;
         }
     }
}

2.

private void drawHorizontal(Canvas c, RecyclerView parent) {
            // 画竖直分割线
            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) parent.getLayoutManager();
            int top,bottom,left,right;
            for(int i=0;i<parent.getChildCount();i++){
                View child = parent.getChildAt(i);
                int position = (int) child.getTag();
                // 判断是否位于边缘
                if(position == linearLayoutManager.getItemCount()-1) continue;
                RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams();
                top = child.getBottom()+layoutParams.bottomMargin;
                bottom = top + mSpace*2;//这里要设置为最高的值
                left = child.getLeft() - layoutParams.leftMargin;
                right = child.getRight() + layoutParams.rightMargin;
                c.drawRect(left,top,right,bottom,mPaint);
            }
}

到此结束

如果想要根据不同Position设置左右间隔也是类似的,这里不再赘言

 

RecyclerView设置分隔线可以通过使用`RecyclerView.ItemDecoration`类来完成。这是一个用于装饰RecyclerView的类,通过它可以添加自定义的分隔线。以下是设置分隔线的一般步骤: 1. 创建一个继承自`RecyclerView.ItemDecoration`的类。 2. 在这个类中重写`onDraw`方法,在其中绘制分隔线。 3. 使用`RecyclerView.addItemDecoration(ItemDecoration decor)`方法将你的自定义装饰类添加到RecyclerView中。 另外,也可以通过`RecyclerView.addItemDecoration(ItemDecoration decor, int index)`方法将装饰项添加到RecyclerView中,`index`参数可以指定装饰项的插入位置。 对于简单的线性分隔线,还可以使用`RecyclerView DividerItemDecoration`,这是一个简便的实现方式,属于RecyclerView库的一部分。例如,在Android的`androidx.recyclerview:recyclerview`库中,可以使用`DividerItemDecoration`如下: ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 添加分隔线 recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); ``` 或者: ```java RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new GridLayoutManager(this, 3)); // 添加分隔线,并指定方向为水平 recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); ``` 注意,如果是水平方向的列表(`LinearLayoutManager`的方向设置为水平),需要将分隔线的方向设置为水平,反之亦然。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值