Skip to content

Commit

Permalink
[ui/#10]: menu Adapter 적용
Browse files Browse the repository at this point in the history
  • Loading branch information
NaZe0320 committed Jan 28, 2024
1 parent 9fccd70 commit 2b50b1f
Show file tree
Hide file tree
Showing 7 changed files with 222 additions and 5 deletions.
19 changes: 19 additions & 0 deletions app/src/main/java/com/umc/coumo/domain/viewmodel/HomeViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.umc.coumo.domain.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.umc.coumo.domain.model.MenuModel
import com.umc.coumo.domain.type.DetailTabType
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
Expand All @@ -13,7 +14,25 @@ class HomeViewModel @Inject constructor(): ViewModel() {
private val _currentTab = MutableLiveData(DetailTabType.INFO)
val currentTab: LiveData<DetailTabType> get() = _currentTab

private val _menuList = MutableLiveData<List<MenuModel>>()
val menuList: LiveData<List<MenuModel>> get() = _menuList

init {
testData()
}

fun changeTab(tab: DetailTabType) {
_currentTab.value = tab
}

private fun testData() {
val list = listOf(
MenuModel(id = 0, name = "아이스 바닐라 라떼", content = "Tall: 4,800\nGrande: 6,800\nTrenta: 6,800"),
MenuModel(id = 1, name = "아이스 바닐라 라떼2", content = "Tall: 4,800\nGrande: 6,800\nTrenta: 6,800", isNew = true),
MenuModel(id = 2, name = "아이스 바닐라 라떼3", content = "Tall: 4,800\nGrande: 6,800\nTrenta: 6,800",),
MenuModel(id = 3, name = "아이스 바닐라 라떼4", content = "Tall: 4,800\nGrande: 6,800\nTrenta: 6,800",),
MenuModel(id = 4, name = "아이스 바닐라 라떼5", content = "Tall: 4,800\nGrande: 6,800\nTrenta: 6,800",),
)
_menuList.value = list
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.umc.coumo.presentation.adapter


import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.umc.coumo.databinding.ItemMenuBinding
import com.umc.coumo.databinding.ItemMenuDetailBinding
import com.umc.coumo.domain.model.MenuModel
import com.umc.coumo.utils.ItemDiffCallback

class MenuAdapter(
private val type: Int
): ListAdapter<MenuModel, RecyclerView.ViewHolder>(
ItemDiffCallback<MenuModel>(
onContentsTheSame = {old, new -> old == new},
onItemsTheSame = {old, new -> old.id == new.id}
)
) {
companion object {
const val MENU_ITEM = 0
const val MENU_DETAIL_ITEM = 1
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
return when (type) {
MENU_ITEM -> {
MenuViewHolder(ItemMenuBinding.inflate(inflater, parent,false))
}
MENU_DETAIL_ITEM -> {
MenuDetailViewHolder(ItemMenuDetailBinding.inflate(inflater, parent,false))
}
else -> throw IllegalArgumentException("Invalid viewType")
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = getItem(position)

when (holder) {
is MenuViewHolder -> {
holder.bind(item)
}
is MenuDetailViewHolder -> {
holder.bind(item)
}
}
}



inner class MenuViewHolder(
private val binding: ItemMenuBinding
): RecyclerView.ViewHolder(binding.root) {
fun bind(item: MenuModel) {
binding.item = item

itemView.setOnClickListener {
listener?.onItemClick(item.id)
}
}
}

inner class MenuDetailViewHolder(
private val binding: ItemMenuDetailBinding
): RecyclerView.ViewHolder(binding.root) {
fun bind(item: MenuModel) {
binding.item = item

itemView.setOnClickListener {
listener?.onItemClick(item.id)
}
}
}

interface OnItemClickListener {
fun onItemClick(id:Int)
}

private var listener: OnItemClickListener? = null

fun setOnItemClickListener(listener: OnItemClickListener) {
this.listener = listener
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,48 @@
package com.umc.coumo.presentation.fragment

import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.umc.coumo.R
import com.umc.coumo.databinding.FragmentHomeDetailInfoBinding
import com.umc.coumo.domain.viewmodel.HomeViewModel
import com.umc.coumo.presentation.adapter.MenuAdapter
import com.umc.coumo.utils.ItemSpacingDecoration
import com.umc.coumo.utils.binding.BindingFragmentNoneBackPress
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class HomeDetailInfoFragment: BindingFragmentNoneBackPress<FragmentHomeDetailInfoBinding>(R.layout.fragment_home_detail_info) {

private val viewModel : HomeViewModel by activityViewModels ()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

setRecyclerView()
}

private fun setRecyclerView() {
val menuAdapter = MenuAdapter(0)

binding.rvMenu.apply {
adapter = menuAdapter
layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
addItemDecoration(ItemSpacingDecoration(requireContext(),0))
}

menuAdapter.setOnItemClickListener(object : MenuAdapter.OnItemClickListener {
override fun onItemClick(id: Int) {
findNavController().navigate(R.id.action_homeDetailFragment_to_homeMenuFragment)
}
})

viewModel.menuList.observe(viewLifecycleOwner) {
viewLifecycleOwner.lifecycleScope.launch (Dispatchers.Main) {
menuAdapter.submitList(it)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,40 @@ package com.umc.coumo.presentation.fragment

import android.os.Bundle
import android.view.View
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.umc.coumo.R
import com.umc.coumo.databinding.FragmentHomeMenuBinding
import com.umc.coumo.domain.viewmodel.HomeViewModel
import com.umc.coumo.presentation.adapter.MenuAdapter
import com.umc.coumo.utils.binding.BindingFragmentNoneBackPress
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class HomeMenuFragment: BindingFragmentNoneBackPress<FragmentHomeMenuBinding>(R.layout.fragment_home_menu) {

private val viewModel : HomeViewModel by activityViewModels ()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

setRecyclerView()

}

private fun setRecyclerView() {
val menuAdapter = MenuAdapter(1)

binding.rvMenu.apply {
adapter = menuAdapter
layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false)
}

viewModel.menuList.observe(viewLifecycleOwner) {
viewLifecycleOwner.lifecycleScope.launch (Dispatchers.Main) {
menuAdapter.submitList(it)
}
}
}
}
50 changes: 48 additions & 2 deletions app/src/main/res/layout/fragment_home_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,53 @@

</data>

<androidx.constraintlayout.widget.ConstraintLayout
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
android:layout_height="wrap_content">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/bottom_above">

<TextView
android:id="@+id/tv_store_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/horizontal_padding"
android:layout_marginTop="24dp"
android:text="앙떼띠 로스터리 (강남점)"
android:textSize="24sp"
android:textColor="@color/font_text"
android:fontFamily="@font/pretendard_700"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

<TextView
android:id="@+id/tv_coupon_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:paddingHorizontal="18dp"
android:paddingVertical="6dp"
android:background="@drawable/shape_rect_side_round"
android:backgroundTint="#E4D9F8"
android:text="쿠모로 4개 모았어요!"
android:textSize="12sp"
android:textColor="#4E4E4E"
android:fontFamily="@font/pretendard_600"
app:layout_constraintStart_toStartOf="@id/tv_store_name"
app:layout_constraintTop_toBottomOf="@id/tv_store_name"/>

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:paddingHorizontal="@dimen/horizontal_padding"
app:layout_constraintTop_toBottomOf="@+id/tv_coupon_count"/>

</androidx.constraintlayout.widget.ConstraintLayout>

</androidx.core.widget.NestedScrollView>
</layout>
2 changes: 1 addition & 1 deletion app/src/main/res/layout/item_menu.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

<TextView
style="@style/NewChipStyle"
android:visibility="@{item.isNew ? View.INVISIBLE : View.VISIBLE}"
android:visibility="@{item.isNew ? View.VISIBLE : View.INVISIBLE}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>

Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/layout/item_menu_detail.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="116dp"
android:layout_marginBottom="14dp">
android:layout_marginBottom="6dp">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
Expand Down Expand Up @@ -78,7 +78,7 @@

<TextView
style="@style/NewChipStyle"
android:visibility="@{item.isNew ? View.INVISIBLE : View.VISIBLE}"
android:visibility="@{item.isNew ? View.VISIBLE : View.INVISIBLE}"
android:layout_marginEnd="40dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
Expand Down

0 comments on commit 2b50b1f

Please sign in to comment.