Skip to content

Commit 9247769

Browse files
committed
feat : 최근 검색 select 구현 및 recyclerview 연결
1 parent fa2fd99 commit 9247769

File tree

7 files changed

+134
-21
lines changed

7 files changed

+134
-21
lines changed

data/src/main/java/com/stop/data/local/model/RecentPlaceSearchEntity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.stop.data.model.nearplace.PlaceRepositoryItem
77
@Entity
88
data class RecentPlaceSearchEntity(
99
@PrimaryKey(autoGenerate = true)
10-
val id: Long = 0,
10+
val id: Int? = null,
1111
val name: String,
1212
val radius: String,
1313
val fullAddressRoad: String,

presentation/src/main/java/com/stop/ui/placesearch/NearPlaceAdapter.kt renamed to presentation/src/main/java/com/stop/ui/placesearch/PlaceSearchAdapter.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import androidx.recyclerview.widget.RecyclerView
88
import com.stop.databinding.ItemNearPlaceBinding
99
import com.stop.domain.model.nearplace.PlaceUseCaseItem
1010

11-
class NearPlaceAdapter : ListAdapter<PlaceUseCaseItem, NearPlaceAdapter.ViewHolder>(diffUtil) {
12-
13-
var onItemClick: ((PlaceUseCaseItem) -> Unit)? = null
11+
class PlaceSearchAdapter(
12+
private val onItemClick: (PlaceUseCaseItem) -> Unit
13+
) : ListAdapter<PlaceUseCaseItem, PlaceSearchAdapter.ViewHolder>(diffUtil) {
1414

1515
class ViewHolder(private val binding: ItemNearPlaceBinding) : RecyclerView.ViewHolder(binding.root) {
1616
fun bind(placeUseCaseItem: PlaceUseCaseItem) {
@@ -26,7 +26,7 @@ class NearPlaceAdapter : ListAdapter<PlaceUseCaseItem, NearPlaceAdapter.ViewHold
2626
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
2727
holder.bind(currentList[position])
2828
holder.itemView.setOnClickListener {
29-
onItemClick?.invoke(currentList[holder.adapterPosition])
29+
onItemClick.invoke(currentList[holder.adapterPosition])
3030
}
3131
}
3232

presentation/src/main/java/com/stop/ui/placesearch/PlaceSearchFragment.kt

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import androidx.lifecycle.lifecycleScope
1616
import androidx.navigation.findNavController
1717
import com.stop.R
1818
import com.stop.databinding.FragmentPlaceSearchBinding
19+
import com.stop.domain.model.nearplace.PlaceUseCaseItem
1920
import dagger.hilt.android.AndroidEntryPoint
2021
import kotlinx.coroutines.FlowPreview
2122
import kotlinx.coroutines.flow.debounce
@@ -31,7 +32,8 @@ class PlaceSearchFragment : Fragment() {
3132

3233
private val placeSearchViewModel: PlaceSearchViewModel by activityViewModels()
3334

34-
private lateinit var nearPlaceAdapter: NearPlaceAdapter
35+
private lateinit var placeSearchAdapter: PlaceSearchAdapter
36+
private lateinit var recentPlaceSearchAdapter: RecentPlaceSearchAdapter
3537

3638
override fun onCreateView(
3739
inflater: LayoutInflater, container: ViewGroup?,
@@ -44,6 +46,13 @@ class PlaceSearchFragment : Fragment() {
4446
return binding.root
4547
}
4648

49+
private fun initBinding() {
50+
binding.apply {
51+
lifecycleOwner = viewLifecycleOwner
52+
viewModel = placeSearchViewModel
53+
}
54+
}
55+
4756
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
4857
super.onViewCreated(view, savedInstanceState)
4958

@@ -55,16 +64,24 @@ class PlaceSearchFragment : Fragment() {
5564
}
5665

5766
private fun initAdapter() {
58-
nearPlaceAdapter = NearPlaceAdapter()
59-
binding.recyclerViewPlace.adapter = nearPlaceAdapter
67+
placeSearchAdapter = PlaceSearchAdapter{
68+
clickPlace(it)
69+
}
70+
recentPlaceSearchAdapter = RecentPlaceSearchAdapter{
71+
clickPlace(it)
72+
}
73+
74+
binding.recyclerViewPlace.adapter = placeSearchAdapter
75+
binding.layoutRecentSearch.recyclerViewRecentSearch.adapter = recentPlaceSearchAdapter
76+
}
6077

61-
nearPlaceAdapter.onItemClick = {
62-
placeSearchViewModel.setClickPlace(it)
63-
placeSearchViewModel.setNearPlacesEmpty()
64-
placeSearchViewModel.insertRecentSearchPlace(it)
78+
private fun clickPlace(placeUseCaseItem: PlaceUseCaseItem) {
79+
placeSearchViewModel.setClickPlace(placeUseCaseItem)
80+
placeSearchViewModel.setNearPlacesEmpty()
81+
placeSearchViewModel.insertRecentSearchPlace(placeUseCaseItem)
82+
83+
binding.root.findNavController().navigate(R.id.action_placeSearchFragment_to_mapFragment)
6584

66-
binding.root.findNavController().navigate(R.id.action_placeSearchFragment_to_mapFragment)
67-
}
6885
}
6986

7087
private fun buttonClick() {
@@ -80,13 +97,6 @@ class PlaceSearchFragment : Fragment() {
8097
}
8198
}
8299

83-
private fun initBinding() {
84-
binding.apply {
85-
lifecycleOwner = viewLifecycleOwner
86-
viewModel = placeSearchViewModel
87-
}
88-
}
89-
90100
private fun listenEditTextChange() {
91101
with(binding) {
92102
textInputEditTextPlaceSearch.setOnFocusChangeListener { _, hasFocus ->
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.stop.ui.placesearch
2+
3+
import android.view.LayoutInflater
4+
import android.view.ViewGroup
5+
import androidx.recyclerview.widget.DiffUtil
6+
import androidx.recyclerview.widget.ListAdapter
7+
import androidx.recyclerview.widget.RecyclerView
8+
import com.stop.databinding.ItemRecentSearchBinding
9+
import com.stop.domain.model.nearplace.PlaceUseCaseItem
10+
11+
class RecentPlaceSearchAdapter(
12+
private var onItemClick: (PlaceUseCaseItem) -> Unit
13+
) : ListAdapter<PlaceUseCaseItem, RecentPlaceSearchAdapter.ViewHolder>(diffUtil) {
14+
15+
class ViewHolder(private val binding: ItemRecentSearchBinding) : RecyclerView.ViewHolder(binding.root) {
16+
fun bind(placeUseCaseItem: PlaceUseCaseItem) {
17+
binding.placeItem = placeUseCaseItem
18+
binding.executePendingBindings()
19+
}
20+
}
21+
22+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
23+
return ViewHolder(ItemRecentSearchBinding.inflate(LayoutInflater.from(parent.context), parent, false))
24+
}
25+
26+
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
27+
holder.bind(currentList[position])
28+
holder.itemView.setOnClickListener {
29+
onItemClick.invoke(currentList[holder.adapterPosition])
30+
}
31+
}
32+
33+
companion object {
34+
val diffUtil = object : DiffUtil.ItemCallback<PlaceUseCaseItem>() {
35+
override fun areItemsTheSame(oldItem: PlaceUseCaseItem, newItem: PlaceUseCaseItem): Boolean {
36+
return oldItem.name == newItem.name
37+
}
38+
39+
override fun areContentsTheSame(oldItem: PlaceUseCaseItem, newItem: PlaceUseCaseItem): Boolean {
40+
return oldItem == newItem
41+
}
42+
}
43+
}
44+
45+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<vector android:height="22dp" android:tint="#666666"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="22dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M12,2C8.13,2 5,5.13 5,9c0,5.25 7,13 7,13s7,-7.75 7,-13c0,-3.87 -3.13,-7 -7,-7zM12,11.5c-1.38,0 -2.5,-1.12 -2.5,-2.5s1.12,-2.5 2.5,-2.5 2.5,1.12 2.5,2.5 -1.12,2.5 -2.5,2.5z"/>
5+
</vector>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
xmlns:tools="http://schemas.android.com/tools">
5+
6+
<data>
7+
8+
<variable
9+
name="placeItem"
10+
type="com.stop.domain.model.nearplace.PlaceUseCaseItem" />
11+
12+
</data>
13+
14+
<androidx.constraintlayout.widget.ConstraintLayout
15+
android:layout_width="match_parent"
16+
android:layout_height="wrap_content">
17+
18+
<TextView
19+
android:id="@+id/text_view_recent_search_title"
20+
android:layout_width="0dp"
21+
android:layout_height="wrap_content"
22+
android:padding="8dp"
23+
android:text="@{placeItem.name}"
24+
android:textColor="@color/black"
25+
android:textSize="22sp"
26+
app:drawableStartCompat="@drawable/ic_baseline_location_on_22"
27+
app:layout_constraintEnd_toEndOf="parent"
28+
app:layout_constraintStart_toStartOf="parent"
29+
app:layout_constraintTop_toTopOf="parent"
30+
tools:text="아남타워" />
31+
32+
<com.google.android.material.divider.MaterialDivider
33+
android:layout_width="0dp"
34+
android:layout_height="2dp"
35+
app:dividerColor="@color/light_grey"
36+
app:layout_constraintBottom_toBottomOf="parent"
37+
app:layout_constraintEnd_toEndOf="parent"
38+
app:layout_constraintStart_toStartOf="parent"
39+
app:layout_constraintTop_toBottomOf="@id/text_view_recent_search_title" />
40+
41+
</androidx.constraintlayout.widget.ConstraintLayout>
42+
43+
</layout>

presentation/src/main/res/layout/layout_recent_search.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,22 @@
2727
app:layout_constraintStart_toStartOf="parent"
2828
app:layout_constraintTop_toTopOf="parent" />
2929

30+
<com.google.android.material.divider.MaterialDivider
31+
android:layout_width="0dp"
32+
android:layout_height="2dp"
33+
android:layout_marginTop="12dp"
34+
app:dividerColor="@color/light_grey"
35+
app:layout_constraintEnd_toEndOf="parent"
36+
app:layout_constraintStart_toStartOf="parent"
37+
app:layout_constraintTop_toBottomOf="@id/text_view_recent_search" />
38+
3039
<androidx.recyclerview.widget.RecyclerView
3140
android:id="@+id/recycler_view_recent_search"
3241
items="@{viewModel.recentPlaceSearch}"
3342
android:layout_width="0dp"
3443
android:layout_height="0dp"
3544
android:layout_marginVertical="12dp"
45+
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
3646
app:layout_constraintBottom_toTopOf="@id/button_delete_recent_search"
3747
app:layout_constraintEnd_toEndOf="parent"
3848
app:layout_constraintStart_toStartOf="parent"

0 commit comments

Comments
 (0)