From ab0bc47f80189152d4a812929516e6ce762f9dd3 Mon Sep 17 00:00:00 2001 From: Ryosuke839 Date: Sun, 17 Sep 2023 00:45:32 +0900 Subject: [PATCH 1/2] Stop spamming notifyItemChanged --- app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt index a502e75..9b3da69 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt @@ -665,8 +665,10 @@ internal class ListAdapter(activity: Activity, pref: SharedPreferences, db: Name runOnUiThread { highTarget?.setBackgroundColor(resnormal) highTarget = null - notifyItemChanged(highlight) - highlight = -1 + if (highlight != -1) { + notifyItemChanged(highlight) + highlight = -1 + } } false } From 5375b353f39495b2794adf223d73c2f07a410c50 Mon Sep 17 00:00:00 2001 From: Ryosuke839 Date: Sun, 17 Sep 2023 00:46:09 +0900 Subject: [PATCH 2/2] Specialize SpanSizeLookup for ListAdapter --- .../jp/ddo/hotmist/unicodepad/ListAdapter.kt | 28 +++++++++++++++++++ .../ddo/hotmist/unicodepad/UnicodeAdapter.kt | 18 ++++++++---- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt index 9b3da69..fbf0e54 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/ListAdapter.kt @@ -710,6 +710,34 @@ internal class ListAdapter(activity: Activity, pref: SharedPreferences, db: Name } } + override fun instantiateSpanSizeLookup(context: Context, spanCount: Int): GridLayoutManager.SpanSizeLookup { + return object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (getItemViewType(position) != 1 || single) 1 else spanCount + } + + override fun getSpanIndex(position: Int, spanCount: Int): Int { + val (itemIndex, titleIndex) = getItemIndex(position) + return if (titleIndex != -1) { + 0 + } else { + itemIndex % spanCount + } + } + + override fun getSpanGroupIndex(adapterPosition: Int, spanCount: Int): Int { + val (itemIndex, titleIndex) = getItemIndex(adapterPosition) + return if (titleIndex != -1) { + titleIndex + (adapterPosition - titleIndex) / spanCount + } else { + adapterPosition - itemIndex + itemIndex / spanCount + } + } + }.also { + it.isSpanIndexCacheEnabled = false + } + } + override fun destroy() { jump = null mark = null diff --git a/app/src/main/java/jp/ddo/hotmist/unicodepad/UnicodeAdapter.kt b/app/src/main/java/jp/ddo/hotmist/unicodepad/UnicodeAdapter.kt index e869434..3bc3d3b 100644 --- a/app/src/main/java/jp/ddo/hotmist/unicodepad/UnicodeAdapter.kt +++ b/app/src/main/java/jp/ddo/hotmist/unicodepad/UnicodeAdapter.kt @@ -94,7 +94,7 @@ abstract class UnicodeAdapter(protected val activity: Activity, private val db: return if (itemIndex == -1) -1L - titleIndex else getItemCodePoint(itemIndex) } - private fun getItemIndex(position: Int): Pair { + protected fun getItemIndex(position: Int): Pair { val titleIndex = searchTitlePosition(position) return if (titleIndex >= 0 && position == getTitlePosition(titleIndex) + titleIndex) -1 to titleIndex @@ -282,13 +282,19 @@ abstract class UnicodeAdapter(protected val activity: Activity, private val db: private var layoutManager: GridLayoutManager? = null + open fun instantiateSpanSizeLookup(context: Context, spanCount: Int): GridLayoutManager.SpanSizeLookup { + return object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (getItemViewType(position) != 1 || single) 1 else spanCount + } + }.also { + it.isSpanIndexCacheEnabled = true + } + } + fun getLayoutManager(context: Context, spanCount: Int): GridLayoutManager { return GridLayoutManager(context, if (single) 1 else spanCount).also { - it.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { - override fun getSpanSize(position: Int): Int { - return if (getItemViewType(position) != 1 || single) 1 else spanCount - } - } + it.spanSizeLookup = instantiateSpanSizeLookup(context, spanCount) layoutManager = it } }