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

Commit 0e21ec9

Browse files
authored
Merge pull request #523 from squanchy-dev/diff_util_for_search
Use ListAdapter to dispatch adapter updates for the SearchActivity
2 parents a8f0e4d + 3171181 commit 0e21ec9

5 files changed

Lines changed: 30 additions & 19 deletions

File tree

app/src/main/java/net/squanchy/search/SearchService.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,16 @@ class SearchService(
6060
}
6161

6262
return ArrayList<SearchListElement>(events.size + speakers.size).apply {
63-
if (events.isNotEmpty()) {
64-
add(EventHeader)
65-
addAll(events.map(::EventElement))
66-
}
67-
6863
if (speakers.isNotEmpty()) {
6964
add(SpeakerHeader)
7065
addAll(speakers.map(::SpeakerElement))
7166
}
7267

68+
if (events.isNotEmpty()) {
69+
add(EventHeader)
70+
addAll(events.map(::EventElement))
71+
}
72+
7373
add(AlgoliaLogo)
7474
}
7575
}

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

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ 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
@@ -20,7 +21,7 @@ import net.squanchy.search.view.SearchItemViewHolder.HeaderViewHolder
2021
import net.squanchy.search.view.SearchItemViewHolder.SearchEventViewHolder
2122
import 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+
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ class SearchRecyclerView @JvmOverloads constructor(
2424

2525
private lateinit var adapter: SearchAdapter
2626

27-
init {
28-
itemAnimator = null
29-
}
30-
3127
override fun onFinishInflate() {
3228
super.onFinishInflate()
3329

app/src/main/res/layout/activity_search.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
<net.squanchy.search.view.SearchRecyclerView
3333
android:id="@+id/searchRecyclerView"
3434
android:layout_width="match_parent"
35-
android:layout_height="wrap_content"
35+
android:layout_height="match_parent"
3636
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
3737

3838
<FrameLayout

app/src/main/res/values/themes.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@
102102

103103
<style name="Theme.Squanchy.SignIn" parent="Theme.Squanchy.BottomSheet" />
104104

105-
<style name="Theme.Squanchy.Search" parent="Theme.Squanchy.MostlyWhite" />
105+
<style name="Theme.Squanchy.Search" parent="Theme.Squanchy.MostlyWhite">
106+
<item name="android:windowBackground">@color/window_background</item>
107+
</style>
106108

107109
<style name="Theme.Squanchy.Settings" parent="Theme.Squanchy.PrimaryStatusBar">
108110
<item name="colorAccent">?attr/colorPrimary</item>

0 commit comments

Comments
 (0)