@@ -3,8 +3,9 @@ package net.squanchy.search.view
33import android.app.Activity
44import android.support.annotation.IntDef
55import android.support.v7.app.AppCompatActivity
6+ import android.support.v7.recyclerview.extensions.ListAdapter
7+ import android.support.v7.util.DiffUtil
68import android.support.v7.widget.GridLayoutManager
7- import android.support.v7.widget.RecyclerView
89import android.view.LayoutInflater
910import android.view.ViewGroup
1011import net.squanchy.R
@@ -20,7 +21,7 @@ import net.squanchy.search.view.SearchItemViewHolder.HeaderViewHolder
2021import net.squanchy.search.view.SearchItemViewHolder.SearchEventViewHolder
2122import net.squanchy.search.view.SearchItemViewHolder.SpeakerViewHolder
2223
23- internal class SearchAdapter (activity : AppCompatActivity ) : RecyclerView.Adapter< SearchItemViewHolder>() {
24+ internal class SearchAdapter (activity : AppCompatActivity ) : ListAdapter<SearchListElement, SearchItemViewHolder>(DiffCallback ) {
2425
2526 private val imageLoader: ImageLoader
2627 private val activity: Activity
@@ -38,7 +39,7 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
3839
3940 @ViewTypeId
4041 override fun getItemViewType (position : Int ): Int {
41- return when (searchResult.elements[ position] ) {
42+ return when (getItem( position) ) {
4243 is SearchListElement .EventHeader -> HEADER
4344 is SearchListElement .SpeakerHeader -> HEADER
4445 is EventElement -> EVENT
@@ -48,7 +49,7 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
4849 }
4950
5051 override fun getItemId (position : Int ): Long {
51- val item = searchResult.elements[ position]
52+ val item = getItem( position)
5253 return when (item) {
5354 is EventElement -> item.event.numericId
5455 is SpeakerElement -> item.speaker.numericId
@@ -88,17 +89,15 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
8889 }
8990 }
9091
91- override fun getItemCount (): Int = searchResult.elements.size
92-
9392 fun createSpanSizeLookup (columnsCount : Int ): GridLayoutManager .SpanSizeLookup {
9493 return GridSpanSizeLookup (searchResult.elements, columnsCount)
9594 }
9695
9796 fun updateWith (searchResult : SearchResult .Success , listener : SearchRecyclerView .OnSearchResultClickListener ) {
98- this .searchResult = searchResult
9997 this .listener = listener
98+ this .searchResult = searchResult
10099
101- notifyDataSetChanged( )
100+ submitList(searchResult.elements )
102101 }
103102
104103 companion object {
@@ -118,3 +117,17 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
118117 private const val ITEM_ID_ALGOLIA_LOGO : Long = 3230264564
119118 }
120119}
120+
121+ private object DiffCallback : DiffUtil.ItemCallback<SearchListElement>() {
122+ override fun areItemsTheSame (oldItem : SearchListElement ? , newItem : SearchListElement ? ): Boolean {
123+ return when {
124+ oldItem is EventElement && newItem is EventElement -> oldItem.event.numericId == newItem.event.numericId
125+ oldItem is SpeakerElement && newItem is SpeakerElement -> oldItem.speaker.numericId == newItem.speaker.numericId
126+ else -> oldItem == newItem
127+ }
128+ }
129+
130+ override fun areContentsTheSame (oldItem : SearchListElement ? , newItem : SearchListElement ? ): Boolean {
131+ return oldItem == newItem
132+ }
133+ }
0 commit comments