From 84c08a639d4b15b44c030efdd980efa8a6c209af Mon Sep 17 00:00:00 2001 From: Goooler Date: Tue, 25 Jun 2024 08:41:22 +0800 Subject: [PATCH] Move refresh functions into delegate --- .../demoapp/adapter/rv/core/BaseRvAdapter.kt | 12 ------ .../adapter/rv/core/IRvAdapterDelegate.kt | 41 ++++++++++++------- .../adapter/rv/diff/BaseRvDiffAdapter.kt | 15 ------- .../adapter/rv/paging/BaseRvPagingAdapter.kt | 4 +- 4 files changed, 30 insertions(+), 42 deletions(-) diff --git a/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/core/BaseRvAdapter.kt b/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/core/BaseRvAdapter.kt index 24ab129d2..d83b9d2e8 100644 --- a/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/core/BaseRvAdapter.kt +++ b/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/core/BaseRvAdapter.kt @@ -33,16 +33,4 @@ abstract class BaseRvAdapter private constructor( } override fun getItemCount(): Int = delegate.list.size - - override fun refreshItems(items: List) { - delegate.refreshItems(items, ::notifyItemChanged) - } - - override fun removeItem(index: Int) { - delegate.removeItem(index, ::notifyItemRemoved) - } - - override fun removeItem(item: M) { - delegate.removeItem(item, ::notifyItemRemoved) - } } diff --git a/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/core/IRvAdapterDelegate.kt b/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/core/IRvAdapterDelegate.kt index 5f9ef8720..7e4e7c8f3 100644 --- a/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/core/IRvAdapterDelegate.kt +++ b/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/core/IRvAdapterDelegate.kt @@ -23,13 +23,14 @@ internal interface RecyclerViewAdapter { } internal interface IRvAdapterDelegate : - IRvAdapter, + IMutableRvAdapter, RecyclerViewAdapter { @Suppress("TooManyFunctions") class Impl : IRvAdapterDelegate where AP : IRvAdapter, - AP : IRvBinding { + AP : IRvBinding, + AP : RecyclerView.Adapter { private val ivdManager = ViewTypeDelegateManager() private val _list = mutableListOf() @@ -90,10 +91,31 @@ internal interface IRvAdapterDelegate adapter.onBindVH(binding, model, payloads) } + override fun refreshItems(items: List) { + refreshItems(items, adapter::notifyItemChanged) + } + + override fun removeItem(index: Int) { + removeItem(index = index, adapter::notifyItemRemoved) + } + + override fun removeItem(item: M) { + removeItem(item = item, adapter::notifyItemRemoved) + } + + /** + * Transform data list. Always return a new list. + */ + fun transform(original: List): List { + val result = mutableListOf() + original.forEach { findLeaf(it, result) } + return result + } + /** * Compare the list to find the same items and refresh them. */ - inline fun refreshItems(items: List, notify: (Int) -> Unit) { + private inline fun refreshItems(items: List, notify: (Int) -> Unit) { transform(items).forEach { if (it in _list) { notify(_list.indexOf(it)) @@ -101,26 +123,17 @@ internal interface IRvAdapterDelegate } } - inline fun removeItem(index: Int, notify: (Int) -> Unit) { + private inline fun removeItem(index: Int, notify: (Int) -> Unit) { _list.removeAt(index) notify(index) } - inline fun removeItem(item: M, notify: (Int) -> Unit) { + private inline fun removeItem(item: M, notify: (Int) -> Unit) { _list.indexOf(item).takeIf { it != -1 }?.let { removeItem(it, notify) } } - /** - * Transform data list. Always return a new list. - */ - fun transform(original: List): List { - val result = mutableListOf() - original.forEach { findLeaf(it, result) } - return result - } - /** * Recursively traversing all leaf nodes. */ diff --git a/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/diff/BaseRvDiffAdapter.kt b/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/diff/BaseRvDiffAdapter.kt index e113ad703..631ed3293 100644 --- a/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/diff/BaseRvDiffAdapter.kt +++ b/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/diff/BaseRvDiffAdapter.kt @@ -45,19 +45,4 @@ abstract class BaseRvDiffAdapter private constructor( delegate.list = value submitList(delegate.transform(value)) } - - /** - * Please do not use it with setList() ! - */ - override fun refreshItems(items: List) { - delegate.refreshItems(items, ::notifyItemChanged) - } - - override fun removeItem(index: Int) { - delegate.removeItem(index, ::notifyItemRemoved) - } - - override fun removeItem(item: M) { - delegate.removeItem(item, ::notifyItemRemoved) - } } diff --git a/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/paging/BaseRvPagingAdapter.kt b/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/paging/BaseRvPagingAdapter.kt index 1c69109d6..cc2374db5 100644 --- a/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/paging/BaseRvPagingAdapter.kt +++ b/adapter/src/main/kotlin/io/goooler/demoapp/adapter/rv/paging/BaseRvPagingAdapter.kt @@ -29,7 +29,9 @@ abstract class BaseRvPagingAdapter private constructor( var onLoadStatusListener: OnLoadStatusListener? = null - override val list: List get() = snapshot().items + override var list: List + get() = snapshot().items + set(value) = error("You shouldn't call this setter. Use submitData() instead.") constructor(callback: DiffCallback = DiffCallback()) : this(callback, IRvAdapterDelegate.Impl()) { @Suppress("LeakingThis")