这几天都在折腾RecyclerView添加分组在最开始使用BaseRecyclerViewAdapterHelper这个类库来解决问题
使用它有个条件得继承MultiItemEntity,分组也得在添加model一个Group标记,对代码有入侵不说,我们还有很多不同的类型例如空出一个之类的,都使用model标记,删除的时候巨痛苦。
前几天看到Android仿微信通讯录:悬停头部分组列表**受到启发,但里面的是LinearLayoutManager.应用场景没有覆盖到自身情况,干脆自己写一个
ItemDecoration有三个方法需要用到的
- onDraw每次滚动时都会调用到,在这里画出分栏的图形
- onDrawOver每次滚动时都会调用到,这里画出的图形最位于View的最顶层,下面的图层都会被覆盖
3 .getItemOffsets每次显示新的cell会调用,用于控制cell的margin,这里用于空出分栏高度的位置
下面记得一步步实现的方式 - 为分栏预留位置,由于使用的是GridLayoutManager,需要判断所在行是不是包含Group标记(也可以抽象成类似UICollectionView的dataSource一样通过外部判断)
- 画出分栏图形
小心的是onDraw不会帮忙迭代, 我是用First和Last分别找到当前需要绘制的rect,然后上色
- 最后画出顶部的分栏和产生推动的效果
displayHeaderRect是一个SparseArrayCompat用于记录当前屏幕分栏的Rect, Rect的坐标和iOS不太一样所以需要更新top和bottom才会有效果