Android类似原生Contact粘滞侧边栏
效果图
粘滞侧边栏
Android的侧边栏实现主要是通过RecyclerView的ItemDecoration来进行实现
override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
val size = parent.childCount - 1
var groupId = ""
var preGroupId = ""
for (i in 0..size) {
val childView = parent.getChildAt(i)
val postion = parent.getChildAdapterPosition(childView)
if (postion < 0) continue
preGroupId = groupId
groupId = callback.getGroupId(postion)
var x = (leftOffset / 2).toFloat()
var y = 0f
if (childView.bottom >= childView.height || isLastInGroup(postion,state.itemCount)) {
y = (childView.bottom - childView.height / 2).toFloat()
} else {
y = (childView.height / 2).toFloat()
}
if (preGroupId != groupId) {
val rect = Rect()
textPaint.getTextBounds(groupId, 0, groupId.length, rect)
c.drawText(groupId, x, y + rect.width() / 2, textPaint)
}
}
}
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
outRect.left = leftOffset
}
private fun isLastInGroup(pos: Int, totalCount: Int): Boolean =
if (pos == totalCount - 1)
true
else
callback.getGroupId(pos) != callback.getGroupId(pos + 1)
然后实现回调接口,获取Item所展示数据的的位置
private fun isLastInGroup(pos: Int, totalCount: Int): Boolean =
if (pos == totalCount - 1)
true
else
callback.getGroupId(pos) != callback.getGroupId(pos + 1)
interface DecorationCallback {
fun getGroupId(pos: Int): String
}