RecycleView:自定义分割线(适用网格布局和线性布局)

RecycleView之自定义分割线

自从RecycleView推出以来,收到一阵好评,几乎完全替代了Listview和GridView,在使用的过程中,为了美化界面样式,我们不得不进行自定义RecycleView的分割线样式来满足我们的需求

利用RecycleView自带的itemDecoration这个类,可以完美的自定义各种分割线。这个类的核心方法有三个:

  • onDraw(Canvas c, RecyclerView parent, State state)
  • onDrawOver(Canvas c, RecyclerView parent, State state)
  • getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)

onDraw这个方法中,主要来为每个子View画分割线,具体的做法可以计算出每个子View的(left,top,right,bottom) , 然后在这个区域内画上分割线。
onDrawOver 顾名思义这是绘制在最上层的画布,甚至比子View所绘制的画布还要顶层。
decoration 的 onDraw,child view 的 onDraw,decoration 的 onDrawOver,这三者是依次发生的。而由于 onDrawOver 是绘制在最上层的,所以它的绘制位置并不受限制(当然,decoration 的 onDraw 绘制范围也不受限制,只不过不可见),所以利用 onDrawOver 可以做很多事情,例如为 RecyclerView 整体顶部绘制一个蒙层,或者为特定的 item view 绘制蒙层。

getItemOffsets方法主要是结算添加分割线之后item进行的偏移量的设置,如果不设置偏移量,绘制出的分割线就会遮盖一部分item
好了,话不多说,来看看具体的代码实现吧

package com.xxxx.adapter;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.View;

import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import static com.minimaxhk.utils.UIUtils.getContext;


/***
 * RecycleView item分割线
 * @author Chalice
 */
public class RecycleViewItemDivider extends RecyclerView.ItemDecoration {
   
    /**
     * 一共会显示几行
     */
    private int   maxSpanGroupIndex;
    /**
     * 每行item的个数
     */
    private int   mSpanCount;
    /**
     * 分割线的宽度
     */
    private int   dividerWidth = 1;
    /***
     * 画笔
     */
    private Paint paint;

    /***
     *
     * @param dividerWidth 分割线宽度
     * @param dividerColor 分割线颜色
     */
    public RecycleViewItemDivider(@NonNull Context context, @NonNull int dividerWidth, @NonNull @ColorRes int dividerColor) {
   
        this.dividerWidth = dp2px(dividerWidth);
        paint = new Paint();
        paint.setColor(context.getResources().getColor(dividerColor));
        paint.setStyle(Paint.Style.FILL);
    }

    /***
     * 在 item 绘制之前调用(就是绘制在 item 的底层)
     *
     */
    @Override
    public void onDraw(@NonNull Canvas canvas, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
   
        super.onDraw(canvas, parent, state);
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager) {
   
            //绘制网格布局分割线
            drawGridLayoutManagerDivider
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值