Skip to content
This repository was archived by the owner on Feb 17, 2020. It is now read-only.

Commit 8de9de7

Browse files
committed
use ListAdapter for updating the list
1 parent 266a5d1 commit 8de9de7

5 files changed

Lines changed: 77 additions & 51 deletions

File tree

app/src/main/java/net/squanchy/search/view/AlgoliaLogoViewHolder.kt

Lines changed: 0 additions & 6 deletions
This file was deleted.

app/src/main/java/net/squanchy/search/view/HeaderViewHolder.kt

Lines changed: 0 additions & 16 deletions
This file was deleted.

app/src/main/java/net/squanchy/search/view/SearchAdapter.kt

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,25 @@ package net.squanchy.search.view
33
import android.app.Activity
44
import android.support.annotation.IntDef
55
import android.support.v7.app.AppCompatActivity
6+
import android.support.v7.recyclerview.extensions.ListAdapter
7+
import android.support.v7.util.DiffUtil
68
import android.support.v7.widget.GridLayoutManager
7-
import android.support.v7.widget.RecyclerView
89
import android.view.LayoutInflater
910
import android.view.ViewGroup
1011
import net.squanchy.R
1112
import net.squanchy.imageloader.ImageLoader
1213
import net.squanchy.imageloader.imageLoaderComponent
1314
import net.squanchy.schedule.view.EventItemView
14-
import net.squanchy.schedule.view.EventViewHolder
1515
import net.squanchy.search.SearchResult
1616
import 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+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package net.squanchy.search.view
2+
3+
import android.support.v7.widget.RecyclerView
4+
import android.view.View
5+
import android.widget.TextView
6+
import net.squanchy.imageloader.ImageLoader
7+
import net.squanchy.schedule.domain.view.Event
8+
import net.squanchy.schedule.view.EventItemView
9+
import net.squanchy.search.SearchItemView
10+
import net.squanchy.speaker.domain.view.Speaker
11+
12+
sealed class SearchItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
13+
14+
class SpeakerViewHolder(itemView: View) : SearchItemViewHolder(itemView) {
15+
16+
fun updateWith(speaker: Speaker, imageLoader: ImageLoader, listener: SearchRecyclerView.OnSearchResultClickListener) {
17+
(itemView as SearchItemView).updateWith(speaker, imageLoader, listener)
18+
}
19+
}
20+
21+
class HeaderViewHolder(itemView: View) : SearchItemViewHolder(itemView) {
22+
23+
fun updateWith(headerType: HeaderType) {
24+
(itemView as TextView).setText(headerType.headerTextResourceId)
25+
}
26+
27+
fun updateWith(label: CharSequence) {
28+
(itemView as TextView).text = label
29+
}
30+
}
31+
32+
class AlgoliaLogoViewHolder(itemView: View) : SearchItemViewHolder(itemView)
33+
34+
class SearchEventViewHolder(itemView: EventItemView) : SearchItemViewHolder(itemView) {
35+
36+
fun updateWith(event: Event, listener: (Event) -> Unit) {
37+
(itemView as EventItemView).updateWith(event)
38+
itemView.setOnClickListener { listener(event) }
39+
}
40+
}
41+
}

app/src/main/java/net/squanchy/search/view/SpeakerViewHolder.kt

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)