From 5b2c99d5a650db8392e00a4a56a0b09f4f0e6ffe Mon Sep 17 00:00:00 2001 From: Daniel Schaal Date: Wed, 14 Jul 2021 14:13:44 +0200 Subject: Refactor DividerItemDecoration --- .../schaal/ocreader/view/DividerItemDecoration.kt | 53 +++++++++++----------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/email/schaal/ocreader/view/DividerItemDecoration.kt b/app/src/main/java/email/schaal/ocreader/view/DividerItemDecoration.kt index 4a93869b..30547c02 100644 --- a/app/src/main/java/email/schaal/ocreader/view/DividerItemDecoration.kt +++ b/app/src/main/java/email/schaal/ocreader/view/DividerItemDecoration.kt @@ -32,9 +32,12 @@ import androidx.recyclerview.widget.RecyclerView.ItemDecoration import email.schaal.ocreader.R class DividerItemDecoration(context: Context, @DimenRes insetRes: Int) : ItemDecoration() { - private val mDivider: Drawable? + private val mDivider: Drawable? = context.obtainStyledAttributes(intArrayOf(android.R.attr.listDivider)).use { + it.getDrawable(0) + } private val inset: Int = context.resources.getDimensionPixelSize(insetRes) - private var size = 0 + private val size = mDivider?.intrinsicHeight ?: 0 + private val dividerRect = Rect(0, 0, 0, 0) override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { @@ -45,34 +48,30 @@ class DividerItemDecoration(context: Context, @DimenRes insetRes: Int) : ItemDec outRect.top = size } - private val dividerRect = Rect(0, 0, 0, 0) override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { if (mDivider == null) return - val layoutManager = parent.layoutManager - check(!(layoutManager !is LinearLayoutManager || - layoutManager.orientation != RecyclerView.VERTICAL)) { "DividerItemDecoration can only be used with a vertical LinearLayoutManager." } - val childCount = parent.childCount - val paddingLeft = parent.paddingLeft - val paddingLeftInset = paddingLeft + inset - dividerRect.right = parent.width - parent.paddingRight - loop@ for (i in 0 until childCount) { - val child = parent.getChildAt(i) - when (layoutManager.getItemViewType(child)) { - R.id.viewtype_item -> if (i == childCount - 1 || i == childCount - 2 && layoutManager.getItemViewType(parent.getChildAt(i + 1)) != R.id.viewtype_item) dividerRect.left = paddingLeft else dividerRect.left = paddingLeftInset - R.id.viewtype_empty, R.id.viewtype_loadmore -> dividerRect.left = paddingLeft - R.id.viewtype_error -> continue@loop - } - dividerRect.top = child.bottom + (child.layoutParams as RecyclerView.LayoutParams).bottomMargin - dividerRect.bottom = dividerRect.top + size - mDivider.bounds = dividerRect - mDivider.draw(c) - } - } - init { - mDivider = context.obtainStyledAttributes(intArrayOf(android.R.attr.listDivider)).use { - it.getDrawable(0) + parent.layoutManager?.let { layoutManager -> + val childCount = parent.childCount + val paddingLeft = parent.paddingLeft + val paddingLeftInset = paddingLeft + inset + dividerRect.right = parent.width - parent.paddingRight + loop@ for (i in 0 until childCount) { + val child = parent.getChildAt(i) + when (layoutManager.getItemViewType(child)) { + R.id.viewtype_item -> if (i == childCount - 1 || i == childCount - 2 && layoutManager.getItemViewType( + parent.getChildAt(i + 1) + ) != R.id.viewtype_item + ) dividerRect.left = paddingLeft else dividerRect.left = paddingLeftInset + R.id.viewtype_empty, R.id.viewtype_loadmore -> dividerRect.left = paddingLeft + R.id.viewtype_error -> continue@loop + } + dividerRect.top = + child.bottom + (child.layoutParams as RecyclerView.LayoutParams).bottomMargin + dividerRect.bottom = dividerRect.top + size + mDivider.bounds = dividerRect + mDivider.draw(c) + } } - if (mDivider != null) size = mDivider.intrinsicHeight } } \ No newline at end of file -- cgit v1.2.3