Skip to content

Instantly share code, notes, and snippets.

@underwindfall
Forked from rock3r/DividerItemDecorator.kt
Created September 6, 2018 12:22
Show Gist options
  • Select an option

  • Save underwindfall/73f7cb3ba8c16ad8ebf9102736793519 to your computer and use it in GitHub Desktop.

Select an option

Save underwindfall/73f7cb3ba8c16ad8ebf9102736793519 to your computer and use it in GitHub Desktop.

Revisions

  1. @rock3r rock3r created this gist Sep 4, 2018.
    49 changes: 49 additions & 0 deletions DividerItemDecorator.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@
    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
    }