From d907193e4146cb8476de526f85f9a8f5724058b9 Mon Sep 17 00:00:00 2001 From: Kirill Nayduik Date: Mon, 28 Feb 2022 13:22:39 +0300 Subject: [PATCH] Add subclass of PagingDataAdapter with implementation of updating inner list --- recyclerview-adapters/build.gradle | 7 +++++ .../adapters/SubmittablePagingAdapter.kt | 27 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 recyclerview-adapters/src/main/java/ru/touchin/roboswag/recyclerview_adapters/adapters/SubmittablePagingAdapter.kt diff --git a/recyclerview-adapters/build.gradle b/recyclerview-adapters/build.gradle index 8b8971b..c72248a 100644 --- a/recyclerview-adapters/build.gradle +++ b/recyclerview-adapters/build.gradle @@ -7,6 +7,8 @@ dependencies { implementation "androidx.core:core-ktx" + implementation "androidx.paging:paging-runtime" + constraints { implementation("androidx.recyclerview:recyclerview") { version { @@ -18,5 +20,10 @@ dependencies { require '1.0.0' } } + implementation("androidx.paging:paging-runtime") { + version { + require '3.0.0-alpha06' + } + } } } diff --git a/recyclerview-adapters/src/main/java/ru/touchin/roboswag/recyclerview_adapters/adapters/SubmittablePagingAdapter.kt b/recyclerview-adapters/src/main/java/ru/touchin/roboswag/recyclerview_adapters/adapters/SubmittablePagingAdapter.kt new file mode 100644 index 0000000..e2162c6 --- /dev/null +++ b/recyclerview-adapters/src/main/java/ru/touchin/roboswag/recyclerview_adapters/adapters/SubmittablePagingAdapter.kt @@ -0,0 +1,27 @@ +package ru.touchin.roboswag.recyclerview_adapters.adapters + +import androidx.paging.PagingDataAdapter +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView + +abstract class SubmittablePagingAdapter(private val diffCallback: DiffUtil.ItemCallback): + PagingDataAdapter(diffCallback) { + /** + * [items] list of updated elements + * [transform] callback that keeps logic of transformation item based on newItem. + * Should return updated element + */ + fun submitList(items: List, transform: T.(newItem: T, payload: Any?) -> T) { + items.forEach { newItem -> + snapshot().forEachIndexed { index, oldItem -> + if (oldItem != null && diffCallback.areItemsTheSame(oldItem, newItem) && !diffCallback.areContentsTheSame(oldItem, newItem)) { + val payload = diffCallback.getChangePayload(oldItem, newItem) + + oldItem.transform(newItem, payload) + + notifyItemChanged(index, payload) + } + } + } + } +}