diff --git a/adapter/rv/src/main/kotlin/io/github/goooler/adapter/rv/internal/IRvAdapter.kt b/adapter/rv/src/main/kotlin/io/github/goooler/adapter/rv/internal/IRvAdapter.kt index 3cb9230a..43db319b 100644 --- a/adapter/rv/src/main/kotlin/io/github/goooler/adapter/rv/internal/IRvAdapter.kt +++ b/adapter/rv/src/main/kotlin/io/github/goooler/adapter/rv/internal/IRvAdapter.kt @@ -67,12 +67,12 @@ internal interface IRvAdapter : RecyclerViewAdapter() - @Suppress("PropertyName", "VariableNaming", "ktlint:standard:backing-property-naming") - protected val _list = mutableListOf() - lateinit var adapter: AP - override val list: List get() = Collections.unmodifiableList(_list) + /** + * Have to override this property in [adapter], we don't store any list data in this delegate. + */ + override val list: List get() = adapter.list override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { initManager(ivdManager) @@ -84,10 +84,7 @@ internal interface IRvAdapter : RecyclerViewAdapter : IRvAdapter { AP : IRvBinding, AP : RecyclerView.Adapter { + private val _list = mutableListOf() + override var list: List - get() = super.list + // Copy a new list to avoid the original list being modified. + get() = _list.toMutableList() set(value) { _list.clear() _list.addAll(flat(value)) } + override operator fun get(position: Int): M = _list[position] + override fun addItems(vararg items: Pair) { items.forEach { (index, item) -> check(index in _list.indices) { "Index $index out of bounds for length ${_list.size}" } diff --git a/adapter/rv/src/main/kotlin/io/github/goooler/adapter/rv/paging/BaseRvPagingAdapter.kt b/adapter/rv/src/main/kotlin/io/github/goooler/adapter/rv/paging/BaseRvPagingAdapter.kt index d00b40a2..d78a44ab 100644 --- a/adapter/rv/src/main/kotlin/io/github/goooler/adapter/rv/paging/BaseRvPagingAdapter.kt +++ b/adapter/rv/src/main/kotlin/io/github/goooler/adapter/rv/paging/BaseRvPagingAdapter.kt @@ -19,16 +19,21 @@ public abstract class BaseRvPagingAdapter private construc IRvBinding, IRvAdapter by delegate { - public var onLoadStatusListener: OnLoadStatusListener? = null - - public override val list: List get() = snapshot().items - public constructor(callback: DiffCallback = DiffCallback()) : this(callback, IRvAdapter.Impl()) { @Suppress("LeakingThis") delegate.adapter = this } - public override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { + public var onLoadStatusListener: OnLoadStatusListener? = null + + public override val list: List get() = snapshot().items + + public override operator fun get(position: Int): M? = getItem(position) + + @LayoutRes + public override fun getItemViewType(position: Int): Int = getItem(position)?.viewType ?: 0 + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { super.onAttachedToRecyclerView(recyclerView) delegate.onAttachedToRecyclerView(recyclerView) addLoadStateListener(loadStateListener) @@ -40,11 +45,6 @@ public abstract class BaseRvPagingAdapter private construc removeLoadStateListener(loadStateListener) } - @LayoutRes - public override fun getItemViewType(position: Int): Int = getItem(position)?.viewType ?: 0 - - public override operator fun get(position: Int): M? = getItem(position) - private val loadStateListener: (CombinedLoadStates) -> Unit = { when { it.refresh is LoadState.Loading -> onLoadStatusListener?.onRefresh()