- mcxtzhang的通讯录标题,可实现吸顶SuspensionIndexBar
这里简单的介绍一下ItemDecoration的原理,这里我就默认同学们已经了解View的测绘流程,主要分为两部分:
-
将分隔线绘制在RecyclerView子视图的下层,因为分隔线ItemDecoration第一个绘制方法ItemDecoration#onDraw发生在绘制RecyclerView子视图之前,如果你想让其显示出来,需要给ItemDecoration设置偏移量,让子视图偏移,从而不会遮挡ItemDecoration。
-
将分隔线绘制在RecyclerView子视图的上层,因为其绘制方法ItemDecoration#onDrawOver发生在RecyclerView子视图绘制绘制完成以后,这也是ItemDecoration能够实现吸顶的效果。
三、代码实战
有了上面的知识储备,下面就简单了。
1. 自定义ItemDecoration
自定义ItemDecoration需要实现的三个方法,跟我们上面提及的原理相关:
| 方法名 | 解释 |
| — | — |
| onDraw
| 绘制子视图下层的分隔线 |
| getItemOffsets
| 通常为了显示下层分隔线而预留的空间 |
| onDrawOver
| 绘制上层的分隔线 |
我们的任务仅仅是绘制一个标题,所以使用上面的两个方法就够了。
1.1 定义数据接口
/**
* 数据约束
*/
public interface IGridItem {
/**
* 是否启用分割线
* @return true
*/
boolean isShow();
/**
* 分类标签
*/
String getTag();
/**
* 权重
*/
int getSpanSize();
}
1.2 自定义ItemDecoration类
核心代码就100多行:
/**
* 适用于GridLayoutManager的分割线
*/
public class GridItemDecoration extends RecyclerView.ItemDecoration {
// 记录上次偏移位置 防止一行多个数据的时候视图偏移
private List offsetPositions = new ArrayList<>();
// 显示数据
private List<? extends IGridItem> gridItems;
// 画笔
private Paint mTitlePaint;
// 存放文字
private Rect mRect;
// 颜色
private int mTitleBgColor;
private int mTitleColor;
private int mTitleHeight;
private int mTitleFontSize;
private Boolean isDrawTitleBg = false;
private Context mContext;
// 总的SpanSize
private int totalSpanSize;
private int mCurrentSpanSize;
//… 省略一些方法
@Override
public void