Skip to content
This repository has been archived by the owner on Jul 16, 2024. It is now read-only.

Commit

Permalink
Git rid of immutable list in RV adapters
Browse files Browse the repository at this point in the history
  • Loading branch information
Goooler committed Jun 26, 2024
1 parent cb7c2f7 commit 58c5141
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 20 deletions.
1 change: 0 additions & 1 deletion adapter/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ android {
}

dependencies {
api(libs.kotlinX.immutable)
api(libs.androidX.collection)
api(libs.androidX.paging)
api(libs.androidX.recyclerView)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import io.goooler.demoapp.adapter.rv.core.ISpanSize.Companion.SPAN_SIZE_FULL
import java.util.Collections
import kotlinx.collections.immutable.toImmutableList

/**
* Keep the same signature as [RecyclerView.Adapter].
Expand Down Expand Up @@ -69,12 +68,12 @@ internal interface IRvAdapter<M : IVhModelType> : RecyclerViewAdapter<BindingVie

private val ivdManager = ViewTypeDelegateManager<M>()

@Suppress("PropertyName", "VariableNaming", "ktlint:standard:backing-property-naming")
protected val _list = mutableListOf<M>()

lateinit var adapter: AP

override val list: List<M> get() = _list.toImmutableList()
/**
* Have to override this property in [adapter], we don't store any list data in this delegate.
*/
override val list: List<M> get() = adapter.list

override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
initManager(ivdManager)
Expand All @@ -86,10 +85,7 @@ internal interface IRvAdapter<M : IVhModelType> : RecyclerViewAdapter<BindingVie
recyclerView.adapter = null
}

override operator fun get(position: Int): M = _list.getOrElse(position) {
// Override get in adapters as a fallback.
adapter[position] ?: error("No such a element in position $position in adapter $adapter.")
}
override operator fun get(position: Int): M = list[position]

@LayoutRes
override fun getItemViewType(position: Int): Int = get(position).viewType
Expand Down Expand Up @@ -184,13 +180,18 @@ internal interface IMutableRvAdapter<M : IVhModelType> : IRvAdapter<M> {
AP : IRvBinding<M>,
AP : RecyclerView.Adapter<BindingViewHolder> {

private val _list = mutableListOf<M>()

override var list: List<M>
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<Int, M>) {
items.forEach { (index, item) ->
check(index in _list.indices) { "Index $index out of bounds for length ${_list.size}" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,20 @@ abstract class BaseRvPagingAdapter<M : IDiffVhModelType> private constructor(
IRvBinding<M>,
IRvAdapter<M> by delegate {

var onLoadStatusListener: OnLoadStatusListener? = null

override val list: List<M> get() = snapshot().items

constructor(callback: DiffCallback<M> = DiffCallback()) : this(callback, IRvAdapter.Impl()) {
@Suppress("LeakingThis")
delegate.adapter = this
}

var onLoadStatusListener: OnLoadStatusListener? = null

override val list: List<M> get() = snapshot().items

override operator fun get(position: Int): M? = getItem(position)

@LayoutRes
override fun getItemViewType(position: Int): Int = getItem(position)?.viewType ?: 0

override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
super.onAttachedToRecyclerView(recyclerView)
delegate.onAttachedToRecyclerView(recyclerView)
Expand All @@ -47,11 +52,6 @@ abstract class BaseRvPagingAdapter<M : IDiffVhModelType> private constructor(
removeLoadStateListener(loadStateListener)
}

@LayoutRes
override fun getItemViewType(position: Int): Int = getItem(position)?.viewType ?: 0

override operator fun get(position: Int): M? = getItem(position)

private val loadStateListener: (CombinedLoadStates) -> Unit = {
when {
it.refresh is LoadState.Loading -> onLoadStatusListener?.onRefresh()
Expand Down

0 comments on commit 58c5141

Please sign in to comment.