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) {
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 }
}
}

@ -44,7 +44,8 @@ class TopSitePagerViewHolder(
}
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.
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.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<TopSiteViewHolder>() {
private var topSites: List<List<TopSite>> = listOf()
fun updateData(topSites: List<TopSite>) {
this.topSites = topSites.chunked(TOP_SITES_PER_PAGE)
notifyDataSetChanged()
}
) : ListAdapter<List<TopSite>, 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<List<TopSite>>() {
override fun areItemsTheSame(oldItem: List<TopSite>, newItem: List<TopSite>): Boolean {
return oldItem.size == newItem.size
}
companion object {
const val TOP_SITES_PER_PAGE = 8
override fun areContentsTheSame(oldItem: List<TopSite>, newItem: List<TopSite>): Boolean {
return newItem.zip(oldItem).all { (new, old) -> new == old }
}
}
}

Loading…
Cancel
Save