From d063cd539652aebd67bac674a5deff7f9e87141b Mon Sep 17 00:00:00 2001 From: Jonathan Almeida Date: Tue, 15 Sep 2020 17:06:29 -0400 Subject: [PATCH] For #14230: Stop redrawing all top sites when one is removed --- .../sessioncontrol/SessionControlAdapter.kt | 4 +-- .../viewholders/TopSitePagerViewHolder.kt | 3 ++- .../topsites/TopSitesPagerAdapter.kt | 26 +++++++++---------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt index bde850a17..dc075d3df 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlAdapter.kt @@ -45,7 +45,7 @@ sealed class AdapterItem(@LayoutRes val viewType: Int) { data class TopSitePager(val topSites: List) : AdapterItem(TopSitePagerViewHolder.LAYOUT_ID) { override fun sameAs(other: AdapterItem): Boolean { val newTopSites = (other as? TopSitePager) ?: return false - return newTopSites.topSites == this.topSites + return newTopSites.topSites.size == this.topSites.size } override fun contentsSameAs(other: AdapterItem): Boolean { @@ -53,7 +53,7 @@ sealed class AdapterItem(@LayoutRes val viewType: Int) { if (newTopSites.topSites.size != this.topSites.size) return false val newSitesSequence = newTopSites.topSites.asSequence() val oldTopSites = this.topSites.asSequence() - return newSitesSequence.zip(oldTopSites).all { (new, old) -> new.title == old.title } + return newSitesSequence.zip(oldTopSites).all { (new, old) -> new == old } } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt index 06affb026..23e59a081 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt @@ -44,7 +44,8 @@ class TopSitePagerViewHolder( } fun bind(topSites: List) { - topSitesPagerAdapter.updateData(topSites) + val chunkedTopSites = topSites.chunked(TOP_SITES_PER_PAGE) + topSitesPagerAdapter.submitList(chunkedTopSites) // Don't show any page indicator if there is only 1 page. val numPages = if (topSites.size > TOP_SITES_PER_PAGE) { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt index b335e57de..e1d1d571f 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt @@ -6,21 +6,16 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.topsites import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import kotlinx.android.synthetic.main.component_top_sites.view.* import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.home.sessioncontrol.viewholders.TopSiteViewHolder class TopSitesPagerAdapter( private val interactor: TopSiteInteractor -) : RecyclerView.Adapter() { - - private var topSites: List> = listOf() - - fun updateData(topSites: List) { - this.topSites = topSites.chunked(TOP_SITES_PER_PAGE) - notifyDataSetChanged() - } +) : ListAdapter, TopSiteViewHolder>(DiffCallback) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopSiteViewHolder { val view = LayoutInflater.from(parent.context) @@ -29,12 +24,17 @@ class TopSitesPagerAdapter( } override fun onBindViewHolder(holder: TopSiteViewHolder, position: Int) { - holder.bind(this.topSites[position]) + val adapter = holder.itemView.top_sites_list.adapter as TopSitesAdapter + adapter.submitList(getItem(position)) } - override fun getItemCount(): Int = this.topSites.size + private object DiffCallback : DiffUtil.ItemCallback>() { + override fun areItemsTheSame(oldItem: List, newItem: List): Boolean { + return oldItem.size == newItem.size + } - companion object { - const val TOP_SITES_PER_PAGE = 8 + override fun areContentsTheSame(oldItem: List, newItem: List): Boolean { + return newItem.zip(oldItem).all { (new, old) -> new == old } + } } }