diff options
author | Daniel Schaal <daniel@schaal.email> | 2021-07-14 15:13:44 +0300 |
---|---|---|
committer | Daniel Schaal <daniel@schaal.email> | 2021-07-25 10:10:47 +0300 |
commit | 5b2c99d5a650db8392e00a4a56a0b09f4f0e6ffe (patch) | |
tree | 2383b9a0b92d8527591f5e850cd65d81d81517ec | |
parent | a017785ac78d97f5322d2ddbccf78ec9eb87337c (diff) |
Refactor DividerItemDecoration
-rw-r--r-- | app/src/main/java/email/schaal/ocreader/view/DividerItemDecoration.kt | 53 |
1 files 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 |