GridLayoutManager这么用,你可能还真没尝试过,安卓性能优化面试

  • mcxtzhang的通讯录标题,可实现吸顶SuspensionIndexBar

这里简单的介绍一下ItemDecoration的原理,这里我就默认同学们已经了解View的测绘流程,主要分为两部分:

  1. 将分隔线绘制在RecyclerView子视图的下层,因为分隔线ItemDecoration第一个绘制方法ItemDecoration#onDraw发生在绘制RecyclerView子视图之前,如果你想让其显示出来,需要给ItemDecoration设置偏移量,让子视图偏移,从而不会遮挡ItemDecoration。

  2. 将分隔线绘制在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

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值