Skip to content

Instantly share code, notes, and snippets.

@underwindfall
Forked from rock3r/DividerItemDecorator.kt
Created September 6, 2018 12:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save underwindfall/73f7cb3ba8c16ad8ebf9102736793519 to your computer and use it in GitHub Desktop.
Save underwindfall/73f7cb3ba8c16ad8ebf9102736793519 to your computer and use it in GitHub Desktop.
A simple yet fully featured RecyclerView ItemDecorator that draws a divider line between items. Only works with vertical LinearLayoutManagers!
package me.seebrock3r.common.widget
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Rect
import android.view.View
import androidx.annotation.ColorInt
import androidx.annotation.Px
import androidx.core.graphics.withTranslation
import androidx.core.view.children
import androidx.recyclerview.widget.RecyclerView
class DividerItemDecorator(
@param:ColorInt @field:ColorInt private val strokeColor: Int,
@param:Px @field:Px private val strokeWidth: Int,
@param:Px @field:Px private val marginStart: Float = 0.0F,
@param:Px @field:Px private val marginEnd: Float = marginStart,
@param:Px @field:Px private val horizontalSpacing: Int,
@param:Px @field:Px private val verticalSpacing: Int = horizontalSpacing
) : RecyclerView.ItemDecoration() {
private val dividerPaint = Paint().apply {
color = strokeColor
flags = Paint.ANTI_ALIAS_FLAG
}
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
outRect.set(horizontalSpacing, verticalSpacing, horizontalSpacing, verticalSpacing)
}
override fun onDrawOver(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
parent.children.forEach { child ->
if (child.isNotLastItem(parent, state.itemCount))
canvas.withTranslation(x = 0.0F, y = verticalSpacing.toFloat()) {
val lineY = child.bottom - strokeWidth / 2.0F
drawLine(
child.left + marginStart,
lineY,
child.right - marginEnd,
lineY,
dividerPaint
)
}
}
}
private fun View.isNotLastItem(parent: RecyclerView, itemCount: Int) =
parent.getChildAdapterPosition(this) < itemCount - 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment