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

Commit 044229f

Browse files
committed
use ListAdapter for updating the list
1 parent 8de9de7 commit 044229f

3 files changed

Lines changed: 27 additions & 36 deletions

File tree

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class SearchActivity : AppCompatActivity(), SearchRecyclerView.OnSearchResultCli
7474

7575
val searchSubscription = querySubject.throttleLast(QUERY_DEBOUNCE_TIMEOUT, TimeUnit.MILLISECONDS)
7676
.doOnNext(::updateSearchActionIcon)
77-
.startWith(EMPTY_QUERY)
77+
.startWith(getInitialQuery())
7878
.flatMap(searchService::find)
7979
.distinctUntilChanged()
8080
.subscribeOn(Schedulers.io())
@@ -93,6 +93,11 @@ class SearchActivity : AppCompatActivity(), SearchRecyclerView.OnSearchResultCli
9393
searchField.requestFocus()
9494
}
9595

96+
private fun getInitialQuery(): String {
97+
val text = searchField.text
98+
return text?.toString() ?: EMPTY_QUERY
99+
}
100+
96101
private fun updateSearchActionIcon(query: String) {
97102
hasQuery = query.isNotEmpty()
98103
invalidateOptionsMenu()

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,20 @@ class SearchService(
5858
if (speakers.isEmpty() && events.isEmpty()) {
5959
return emptyList()
6060
}
61-
val list = ArrayList<SearchListElement>(events.size + speakers.size)
62-
if (events.isNotEmpty()) {
63-
list.add(EventHeader)
64-
list.addAll(events.map(::EventElement))
65-
}
66-
if (speakers.isNotEmpty()) {
67-
list.add(SpeakerHeader)
68-
list.addAll(speakers.map(::SpeakerElement))
61+
62+
return ArrayList<SearchListElement>(events.size + speakers.size).apply {
63+
if (events.isNotEmpty()) {
64+
add(EventHeader)
65+
addAll(events.map(::EventElement))
66+
}
67+
68+
if (speakers.isNotEmpty()) {
69+
add(SpeakerHeader)
70+
addAll(speakers.map(::SpeakerElement))
71+
}
72+
73+
add(AlgoliaLogo)
6974
}
70-
list.add(AlgoliaLogo)
71-
return list
7275
}
7376

7477
fun speakers(): Observable<List<Speaker>> {

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

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ 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
86
import android.support.v7.widget.GridLayoutManager
7+
import android.support.v7.widget.RecyclerView
98
import android.view.LayoutInflater
109
import android.view.ViewGroup
1110
import net.squanchy.R
@@ -21,7 +20,7 @@ import net.squanchy.search.view.SearchItemViewHolder.HeaderViewHolder
2120
import net.squanchy.search.view.SearchItemViewHolder.SearchEventViewHolder
2221
import net.squanchy.search.view.SearchItemViewHolder.SpeakerViewHolder
2322

24-
internal class SearchAdapter(activity: AppCompatActivity) : ListAdapter<SearchListElement, SearchItemViewHolder>(DiffCallback) {
23+
internal class SearchAdapter(activity: AppCompatActivity) : RecyclerView.Adapter<SearchItemViewHolder>() {
2524

2625
private val imageLoader: ImageLoader
2726
private val activity: Activity
@@ -51,10 +50,10 @@ internal class SearchAdapter(activity: AppCompatActivity) : ListAdapter<SearchLi
5150
override fun getItemId(position: Int): Long {
5251
val item = searchResult.elements[position]
5352
return when (item) {
54-
is SearchListElement.EventHeader -> ITEM_ID_EVENTS_HEADER
55-
is SearchListElement.SpeakerHeader -> ITEM_ID_SPEAKERS_HEADER
5653
is EventElement -> item.event.numericId
5754
is SpeakerElement -> item.speaker.numericId
55+
is SearchListElement.EventHeader -> ITEM_ID_EVENTS_HEADER
56+
is SearchListElement.SpeakerHeader -> ITEM_ID_SPEAKERS_HEADER
5857
is SearchListElement.AlgoliaLogo -> ITEM_ID_ALGOLIA_LOGO
5958
}
6059
}
@@ -89,16 +88,17 @@ internal class SearchAdapter(activity: AppCompatActivity) : ListAdapter<SearchLi
8988
}
9089
}
9190

91+
override fun getItemCount(): Int = searchResult.elements.size
92+
9293
fun createSpanSizeLookup(columnsCount: Int): GridLayoutManager.SpanSizeLookup {
9394
return GridSpanSizeLookup(searchResult.elements, columnsCount)
9495
}
9596

96-
override fun getItemCount(): Int = searchResult.elements.size
97-
9897
fun updateWith(searchResult: SearchResult.Success, listener: SearchRecyclerView.OnSearchResultClickListener) {
9998
this.searchResult = searchResult
10099
this.listener = listener
101-
submitList(searchResult.elements)
100+
101+
notifyDataSetChanged()
102102
}
103103

104104
companion object {
@@ -120,20 +120,3 @@ internal class SearchAdapter(activity: AppCompatActivity) : ListAdapter<SearchLi
120120
private const val ITEM_ID_ALGOLIA_LOGO: Long = -102
121121
}
122122
}
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

Comments
 (0)