@@ -3,19 +3,25 @@ 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
1112import net.squanchy.imageloader.ImageLoader
1213import net.squanchy.imageloader.imageLoaderComponent
1314import net.squanchy.schedule.view.EventItemView
14- import net.squanchy.schedule.view.EventViewHolder
1515import net.squanchy.search.SearchResult
1616import net.squanchy.search.SearchListElement
17+ import net.squanchy.search.SearchListElement.EventElement
18+ import net.squanchy.search.SearchListElement.SpeakerElement
19+ import net.squanchy.search.view.SearchItemViewHolder.AlgoliaLogoViewHolder
20+ import net.squanchy.search.view.SearchItemViewHolder.HeaderViewHolder
21+ import net.squanchy.search.view.SearchItemViewHolder.SearchEventViewHolder
22+ import net.squanchy.search.view.SearchItemViewHolder.SpeakerViewHolder
1723
18- internal class SearchAdapter (activity : AppCompatActivity ) : RecyclerView.Adapter<RecyclerView.ViewHolder>( ) {
24+ internal class SearchAdapter (activity : AppCompatActivity ) : ListAdapter<SearchListElement, SearchItemViewHolder>( DiffCallback ) {
1925
2026 private val imageLoader: ImageLoader
2127 private val activity: Activity
@@ -36,8 +42,8 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
3642 return when (searchResult.elements[position]) {
3743 is SearchListElement .EventHeader -> HEADER
3844 is SearchListElement .SpeakerHeader -> HEADER
39- is SearchListElement . EventElement -> EVENT
40- is SearchListElement . SpeakerElement -> SPEAKER
45+ is EventElement -> EVENT
46+ is SpeakerElement -> SPEAKER
4147 is SearchListElement .AlgoliaLogo -> ALGOLIA_LOGO
4248 }
4349 }
@@ -47,13 +53,13 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
4753 return when (item) {
4854 is SearchListElement .EventHeader -> ITEM_ID_EVENTS_HEADER
4955 is SearchListElement .SpeakerHeader -> ITEM_ID_SPEAKERS_HEADER
50- is SearchListElement . EventElement -> item.event.numericId
51- is SearchListElement . SpeakerElement -> item.speaker.numericId
56+ is EventElement -> item.event.numericId
57+ is SpeakerElement -> item.speaker.numericId
5258 is SearchListElement .AlgoliaLogo -> ITEM_ID_ALGOLIA_LOGO
5359 }
5460 }
5561
56- override fun onCreateViewHolder (parent : ViewGroup , @ViewTypeId viewType : Int ): RecyclerView . ViewHolder {
62+ override fun onCreateViewHolder (parent : ViewGroup , @ViewTypeId viewType : Int ): SearchItemViewHolder {
5763 when (viewType) {
5864 HEADER -> return HeaderViewHolder (LayoutInflater .from(activity).inflate(R .layout.item_search_header, parent, false ))
5965 SPEAKER -> {
@@ -62,7 +68,7 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
6268 }
6369 EVENT -> {
6470 val view = LayoutInflater .from(activity).inflate(R .layout.item_schedule_event_talk, parent, false )
65- return EventViewHolder (view as EventItemView )
71+ return SearchEventViewHolder (view as EventItemView )
6672 }
6773 ALGOLIA_LOGO -> {
6874 val view = LayoutInflater .from(activity).inflate(R .layout.item_search_algolia_logo, parent, false )
@@ -72,13 +78,13 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
7278 }
7379 }
7480
75- override fun onBindViewHolder (holder : RecyclerView . ViewHolder , position : Int ) {
81+ override fun onBindViewHolder (holder : SearchItemViewHolder , position : Int ) {
7682 val item = searchResult.elements[position]
7783 when (item) {
7884 is SearchListElement .EventHeader -> (holder as HeaderViewHolder ).updateWith(HeaderType .EVENTS )
7985 is SearchListElement .SpeakerHeader -> (holder as HeaderViewHolder ).updateWith(HeaderType .SPEAKERS )
80- is SearchListElement . EventElement -> (holder as EventViewHolder ).updateWith(item.event) { listener.onEventClicked(it) }
81- is SearchListElement . SpeakerElement -> (holder as SpeakerViewHolder ).updateWith(item.speaker, imageLoader, listener)
86+ is EventElement -> (holder as SearchEventViewHolder ).updateWith(item.event) { listener.onEventClicked(it) }
87+ is SpeakerElement -> (holder as SpeakerViewHolder ).updateWith(item.speaker, imageLoader, listener)
8288 is SearchListElement .AlgoliaLogo -> Unit // Nothing to do
8389 }
8490 }
@@ -92,8 +98,7 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
9298 fun updateWith (searchResult : SearchResult .Success , listener : SearchRecyclerView .OnSearchResultClickListener ) {
9399 this .searchResult = searchResult
94100 this .listener = listener
95-
96- notifyDataSetChanged()
101+ submitList(searchResult.elements)
97102 }
98103
99104 companion object {
@@ -115,3 +120,20 @@ internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter
115120 private const val ITEM_ID_ALGOLIA_LOGO : Long = - 102
116121 }
117122}
123+
124+ private object DiffCallback : DiffUtil.ItemCallback<SearchListElement>() {
125+
126+ override fun areItemsTheSame (oldItem : SearchListElement ? , newItem : SearchListElement ? ): Boolean {
127+ if (oldItem is EventElement && newItem is EventElement ) {
128+ return oldItem.event.id == newItem.event.id
129+ }
130+ if (oldItem is SpeakerElement && newItem is SpeakerElement ) {
131+ return oldItem.speaker.id == newItem.speaker.id
132+ }
133+ return oldItem == newItem
134+ }
135+
136+ override fun areContentsTheSame (oldItem : SearchListElement ? , newItem : SearchListElement ? ): Boolean {
137+ return oldItem == newItem
138+ }
139+ }
0 commit comments