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