Skip to content
This repository was archived by the owner on May 24, 2022. It is now read-only.

Commit bfa339a

Browse files
committed
refactor query suggestions guide
1 parent def825b commit bfa339a

File tree

11 files changed

+74
-82
lines changed

11 files changed

+74
-82
lines changed

guide/guides/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
android:parentActivityName=".directory.DirectoryActivity" />
3535

3636
<activity
37-
android:name=".querysuggestion.QuerySuggestionGuide"
37+
android:name=".querysuggestion.QuerySuggestionActivity"
3838
android:parentActivityName=".directory.DirectoryActivity" />
3939

4040
</application>

guide/guides/src/main/kotlin/com/algolia/instantsearch/guides/directory/Directory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ package com.algolia.instantsearch.guides.directory
22

33
import com.algolia.instantsearch.guides.gettingstarted.GettingStartedGuide
44
import com.algolia.instantsearch.guides.places.PlacesActivity
5-
import com.algolia.instantsearch.guides.querysuggestion.QuerySuggestionGuide
5+
import com.algolia.instantsearch.guides.querysuggestion.QuerySuggestionActivity
66
import com.algolia.search.model.ObjectID
77

88

99
val guides = mapOf(
1010
ObjectID("guide_getting_started") to GettingStartedGuide::class,
1111
ObjectID("guide_places") to PlacesActivity::class,
12-
ObjectID("guide_query_suggestion") to QuerySuggestionGuide::class
12+
ObjectID("guide_query_suggestion") to QuerySuggestionActivity::class
1313
)

guide/guides/src/main/kotlin/com/algolia/instantsearch/guides/querysuggestion/QuerySuggestionGuide.kt renamed to guide/guides/src/main/kotlin/com/algolia/instantsearch/guides/querysuggestion/QuerySuggestionActivity.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import com.algolia.instantsearch.guides.querysuggestion.product.ProductFragment
1313
import com.algolia.instantsearch.guides.querysuggestion.suggestion.SuggestionFragment
1414
import com.algolia.instantsearch.searchbox.connectView
1515

16-
class QuerySuggestionGuide : AppCompatActivity() {
16+
class QuerySuggestionActivity : AppCompatActivity() {
1717

1818
private val viewModel by viewModels<QuerySuggestionViewModel>()
1919
private val connection = ConnectionHandler()
@@ -32,10 +32,9 @@ class QuerySuggestionGuide : AppCompatActivity() {
3232
}
3333

3434
// Observe suggestions
35-
viewModel.suggestions.observe(this) {
36-
searchBoxView.setText(it.query, true)
37-
}
35+
viewModel.suggestions.observe(this) { searchBoxView.setText(it.query, true) }
3836

37+
// Show products view
3938
showProducts()
4039
}
4140

guide/guides/src/main/kotlin/com/algolia/instantsearch/guides/querysuggestion/QuerySuggestionViewModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.algolia.instantsearch.guides.querysuggestion
22

33
import androidx.lifecycle.MutableLiveData
44
import androidx.lifecycle.ViewModel
5+
import com.algolia.instantsearch.core.connection.ConnectionHandler
56
import com.algolia.instantsearch.guides.querysuggestion.suggestion.Suggestion
67
import com.algolia.instantsearch.searchbox.SearchBoxConnector
78
import com.algolia.instantsearch.searcher.hits.addHitsSearcher
@@ -23,11 +24,13 @@ class QuerySuggestionViewModel : ViewModel() {
2324
val productSearcher = multiSearcher.addHitsSearcher(indexName = IndexName("instant_search"))
2425
val suggestionSearcher = multiSearcher.addHitsSearcher(indexName = IndexName("instantsearch_query_suggestions"))
2526
val searchBox = SearchBoxConnector(multiSearcher)
27+
private val connection = ConnectionHandler(searchBox)
28+
2629
val suggestions = MutableLiveData<Suggestion>()
2730

2831
override fun onCleared() {
2932
multiSearcher.cancel()
30-
searchBox.disconnect()
33+
connection.clear()
3134
client.close()
3235
}
3336
}

guide/guides/src/main/kotlin/com/algolia/instantsearch/guides/querysuggestion/extension/RecyclerView.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.algolia.instantsearch.guides.querysuggestion.extension
22

3+
import android.content.Context
34
import android.view.View
5+
import android.view.ViewGroup
46
import androidx.recyclerview.widget.LinearLayoutManager
57
import androidx.recyclerview.widget.RecyclerView
68
import com.algolia.instantsearch.android.list.autoScrollToStart
@@ -12,3 +14,10 @@ internal fun RecyclerView.configure(recyclerViewAdapter: RecyclerView.Adapter<*>
1214
itemAnimator = null
1315
autoScrollToStart(recyclerViewAdapter)
1416
}
17+
18+
internal fun createRecyclerView(context: Context) = RecyclerView(context).apply {
19+
layoutParams = ViewGroup.LayoutParams(
20+
ViewGroup.LayoutParams.MATCH_PARENT,
21+
ViewGroup.LayoutParams.MATCH_PARENT
22+
)
23+
}
Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,45 @@
11
package com.algolia.instantsearch.guides.querysuggestion.product
22

3-
import android.view.LayoutInflater
3+
import android.view.View
44
import android.view.ViewGroup
5+
import android.widget.TextView
56
import androidx.recyclerview.widget.DiffUtil
67
import androidx.recyclerview.widget.ListAdapter
8+
import androidx.recyclerview.widget.RecyclerView
9+
import com.algolia.instantsearch.android.highlighting.toSpannedString
10+
import com.algolia.instantsearch.android.inflate
711
import com.algolia.instantsearch.core.hits.HitsView
8-
import com.algolia.instantsearch.guides.databinding.ListItemLargeBinding
12+
import com.algolia.instantsearch.guides.R
13+
import com.algolia.instantsearch.guides.querysuggestion.product.ProductAdapter.ProductViewHolder
14+
import com.bumptech.glide.Glide
915

10-
class ProductAdapter : ListAdapter<Product, ProductViewHolder>(ProductAdapter),
11-
HitsView<Product> {
16+
class ProductAdapter : ListAdapter<Product, ProductViewHolder>(ProductAdapter), HitsView<Product> {
1217

13-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder {
14-
return ProductViewHolder(
15-
ListItemLargeBinding.inflate(LayoutInflater.from(parent.context), parent, false)
16-
)
17-
}
18+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
19+
ProductViewHolder(parent.inflate(R.layout.list_item_large))
1820

19-
override fun onBindViewHolder(holder: ProductViewHolder, position: Int) {
21+
override fun onBindViewHolder(holder: ProductViewHolder, position: Int) =
2022
holder.bind(getItem(position))
21-
}
2223

23-
override fun setHits(hits: List<Product>) {
24-
submitList(hits)
25-
}
24+
override fun setHits(hits: List<Product>) = submitList(hits)
2625

27-
companion object : DiffUtil.ItemCallback<Product>() {
26+
class ProductViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
2827

29-
override fun areItemsTheSame(oldItem: Product, newItem: Product): Boolean {
30-
return oldItem.objectID == newItem.objectID
28+
fun bind(item: Product) {
29+
view.findViewById<TextView>(R.id.itemTitle).text =
30+
item.highlightedName?.toSpannedString() ?: item.name
31+
view.findViewById<TextView>(R.id.itemSubtitle).text = item.price.toString()
32+
Glide
33+
.with(view.context)
34+
.load(item.image)
35+
.into(view.findViewById(R.id.itemImage))
3136
}
37+
}
3238

33-
override fun areContentsTheSame(oldItem: Product, newItem: Product): Boolean {
34-
return oldItem == newItem
35-
}
39+
companion object : DiffUtil.ItemCallback<Product>() {
40+
override fun areItemsTheSame(oldItem: Product, newItem: Product) =
41+
oldItem.objectID == newItem.objectID
42+
43+
override fun areContentsTheSame(oldItem: Product, newItem: Product) = oldItem == newItem
3644
}
3745
}

guide/guides/src/main/kotlin/com/algolia/instantsearch/guides/querysuggestion/product/ProductViewHolder.kt

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,44 @@
11
package com.algolia.instantsearch.guides.querysuggestion.suggestion
22

3-
import android.view.LayoutInflater
3+
import android.view.View
44
import android.view.ViewGroup
5+
import android.widget.TextView
56
import androidx.recyclerview.widget.DiffUtil
67
import androidx.recyclerview.widget.ListAdapter
8+
import androidx.recyclerview.widget.RecyclerView
9+
import com.algolia.instantsearch.android.highlighting.toSpannedString
10+
import com.algolia.instantsearch.android.inflate
711
import com.algolia.instantsearch.core.hits.HitsView
8-
import com.algolia.instantsearch.guides.databinding.ListItemSuggestionBinding
12+
import com.algolia.instantsearch.guides.R
13+
import com.algolia.instantsearch.guides.querysuggestion.suggestion.SuggestionAdapter.SuggestionViewHolder
914

10-
class SuggestionAdapter(private val onSuggestionClick: ((Suggestion) -> Unit)? = null) :
15+
class SuggestionAdapter(private val onSuggestionClick: ((Suggestion) -> Unit)) :
1116
ListAdapter<Suggestion, SuggestionViewHolder>(SuggestionAdapter),
1217
HitsView<Suggestion> {
1318

14-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SuggestionViewHolder {
15-
return SuggestionViewHolder(
16-
ListItemSuggestionBinding.inflate(LayoutInflater.from(parent.context), parent, false)
17-
)
18-
}
19+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) =
20+
SuggestionViewHolder(parent.inflate(R.layout.list_item_suggestion))
1921

2022
override fun onBindViewHolder(holder: SuggestionViewHolder, position: Int) {
2123
val item = getItem(position)
2224
holder.bind(item, onSuggestionClick)
2325
}
2426

25-
override fun setHits(hits: List<Suggestion>) {
26-
submitList(hits)
27-
}
27+
override fun setHits(hits: List<Suggestion>) = submitList(hits)
2828

29-
companion object : DiffUtil.ItemCallback<Suggestion>() {
29+
class SuggestionViewHolder(private val view: View) : RecyclerView.ViewHolder(view) {
3030

31-
override fun areItemsTheSame(oldItem: Suggestion, newItem: Suggestion): Boolean {
32-
return oldItem.objectID == newItem.objectID
31+
fun bind(item: Suggestion, onClick: ((Suggestion) -> Unit)) {
32+
view.setOnClickListener { onClick(item) }
33+
view.findViewById<TextView>(R.id.itemName).text = item.highlightedQuery?.toSpannedString() ?: item.query
3334
}
35+
}
3436

35-
override fun areContentsTheSame(oldItem: Suggestion, newItem: Suggestion): Boolean {
36-
return oldItem == newItem
37-
}
37+
companion object : DiffUtil.ItemCallback<Suggestion>() {
38+
override fun areItemsTheSame(oldItem: Suggestion, newItem: Suggestion) =
39+
oldItem.objectID == newItem.objectID
40+
41+
override fun areContentsTheSame(oldItem: Suggestion, newItem: Suggestion): Boolean =
42+
oldItem == newItem
3843
}
3944
}

guide/guides/src/main/kotlin/com/algolia/instantsearch/guides/querysuggestion/suggestion/SuggestionFragment.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ class SuggestionFragment : Fragment(R.layout.fragment_items) {
2020
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
2121
super.onViewCreated(view, savedInstanceState)
2222
// Configure suggestions view
23-
val suggestionAdapter = SuggestionAdapter { viewModel.suggestions.value = it }
23+
val suggestionAdapter = SuggestionAdapter {
24+
// On suggestion click, update the
25+
viewModel.suggestions.value = it
26+
}
2427
view.findViewById<RecyclerView>(R.id.items).configure(suggestionAdapter)
2528
connection += viewModel.suggestionSearcher.connectHitsView(suggestionAdapter) {
2629
it.hits.deserialize(Suggestion.serializer())

guide/guides/src/main/kotlin/com/algolia/instantsearch/guides/querysuggestion/suggestion/SuggestionViewHolder.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
3-
xmlns:tools="http://schemas.android.com/tools"
43
android:id="@+id/items"
54
android:layout_width="match_parent"
6-
android:layout_height="match_parent"
7-
tools:listitem="@layout/list_item_large" />
5+
android:layout_height="match_parent" />

0 commit comments

Comments
 (0)