For #14230: Stop redrawing all top sites when one is removed

pull/149/head
Jonathan Almeida 4 years ago committed by Jonathan Almeida
parent 5b33044999
commit d063cd5396

@ -45,7 +45,7 @@ sealed class AdapterItem(@LayoutRes val viewType: Int) {
data class TopSitePager(val topSites: List<TopSite>) : AdapterItem(TopSitePagerViewHolder.LAYOUT_ID) { data class TopSitePager(val topSites: List<TopSite>) : AdapterItem(TopSitePagerViewHolder.LAYOUT_ID) {
override fun sameAs(other: AdapterItem): Boolean { override fun sameAs(other: AdapterItem): Boolean {
val newTopSites = (other as? TopSitePager) ?: return false 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 { 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 if (newTopSites.topSites.size != this.topSites.size) return false
val newSitesSequence = newTopSites.topSites.asSequence() val newSitesSequence = newTopSites.topSites.asSequence()
val oldTopSites = this.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 }
} }
} }

@ -44,7 +44,8 @@ class TopSitePagerViewHolder(
} }
fun bind(topSites: List<TopSite>) { fun bind(topSites: List<TopSite>) {
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. // Don't show any page indicator if there is only 1 page.
val numPages = if (topSites.size > TOP_SITES_PER_PAGE) { val numPages = if (topSites.size > TOP_SITES_PER_PAGE) {

@ -6,21 +6,16 @@ package org.mozilla.fenix.home.sessioncontrol.viewholders.topsites
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup 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 mozilla.components.feature.top.sites.TopSite
import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor import org.mozilla.fenix.home.sessioncontrol.TopSiteInteractor
import org.mozilla.fenix.home.sessioncontrol.viewholders.TopSiteViewHolder import org.mozilla.fenix.home.sessioncontrol.viewholders.TopSiteViewHolder
class TopSitesPagerAdapter( class TopSitesPagerAdapter(
private val interactor: TopSiteInteractor private val interactor: TopSiteInteractor
) : RecyclerView.Adapter<TopSiteViewHolder>() { ) : ListAdapter<List<TopSite>, TopSiteViewHolder>(DiffCallback) {
private var topSites: List<List<TopSite>> = listOf()
fun updateData(topSites: List<TopSite>) {
this.topSites = topSites.chunked(TOP_SITES_PER_PAGE)
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopSiteViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TopSiteViewHolder {
val view = LayoutInflater.from(parent.context) val view = LayoutInflater.from(parent.context)
@ -29,12 +24,17 @@ class TopSitesPagerAdapter(
} }
override fun onBindViewHolder(holder: TopSiteViewHolder, position: Int) { 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<List<TopSite>>() {
override fun areItemsTheSame(oldItem: List<TopSite>, newItem: List<TopSite>): Boolean {
return oldItem.size == newItem.size
}
companion object { override fun areContentsTheSame(oldItem: List<TopSite>, newItem: List<TopSite>): Boolean {
const val TOP_SITES_PER_PAGE = 8 return newItem.zip(oldItem).all { (new, old) -> new == old }
}
} }
} }

Loading…
Cancel
Save