[RecyclerView] 字母分组及悬浮吸顶效果
悬浮吸顶效果
先看下效果
这是一个区域列表,每个区域都有所属的拼音首字母。需要在滑动的时候,将对应区域所在分组悬浮在顶部。悬浮顶部的字母分组需要根据列表下一个分组的滑动而适当改变位置,实现“顶上去”的效果。
实现思路:
- 利用RecyclerView.ItemDecoration绘制字母部分(就像绘制分割线一样)
- 同一组的商圈,只绘制一个字母
- 计算偏移,将当前字母拼音固定在顶部
- 根据列表滑动,实现偏移效果
ItemDecoration
ItemDecoration字面意思:Item的装饰。ItemDecoration的功能非常强大,我们常用它来实现分割线的效果。
ItemDecoration源码如下:主要包含三个核心方法
public abstract static class ItemDecoration {
/**
* onDraw:通过该方法,在Canvas上绘制内容,在绘制Item之前调用。(如果没有通过getItemOffsets设置偏移的话,Item的内容会将其覆盖)
*/
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull State state) {
onDraw(c, parent);
}
/**
* @deprecated
* Override {@link #onDraw(Canvas, RecyclerView, RecyclerView.State)}
*/
@Deprecated
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent) {
}
/**
* onDrawOver:通过该方法,在Canvas上绘制内容,在Item之后调用。(画的内容会覆盖在item的上层)
*/
public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent,
@NonNull State state) {
onDrawOver(c, parent);
}
/**
* @deprecated
* Override {@link #onDrawOver(Canvas, RecyclerView, RecyclerView.State)}
*/
@Deprecated
public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent) {
}
/**
* @deprecated
* Use {@link #getItemOffsets(Rect, View, RecyclerView, State)}
*/
@Deprecated
public void getItemOffsets(@NonNull Rect outRect, int itemPosition,
@NonNull RecyclerView parent) {
outRect.set(0,