메뉴 옵션 선택 후 주문 담기 버튼을 누르게 되면 나오는 화면
각 메뉴의 수량을 변경하여 해당 아이템의 가격, 옵션 가격, 총금액이 변경되는 모습 확인 가능
각 아이템 삭제 및 전체 삭제 가능
만약 주문하지 않은 상태로 결제하기 버튼 클릭시 메뉴 선택하라는 토스트 메시지 출력
주문한 경우 결제 버튼 클릭시 총주문한 목록을 한 번에 볼 수 있는 다이얼로그 창으로 화면 전환
val lyj_ItemName = lyj_optionMenuName.text.toString()
val lyj_ItemPriceText = lyj_optionMenuPrice.text.toString()
val lyj_ItemCnt = "1".toInt()
val selectedHotIceOption: String
// 리사이클러뷰로 옵션 선택한 문자열 넘기기
selectedHotIceOption = if (lyj_optHot.isChecked) "뜨거운 (HOT)"
else if (lyj_optIce.isChecked) "차가운 (ICE)" else ""
val lyj_itemData = ItemData(
id,
lyj_ItemName,
lyj_ItemPriceText,
lyj_ItemCnt,
selectedHotIceOption,
lyj_plusOptShot,
lyj_plusOptShotPrice
)
val mainActivity = activity as MainActivity
// 아이템 추가
mainActivity.addNewItem(lyj_itemData)
dismiss()
- 위에서 구한 정보를 사용하여 ItemData 객체를 생성
- MainActivity의 인스턴스를 얻어와 작성되어 있는 addNewItem에 lyj_itemData를 전달하여 주문 아이템 추가
- dismiss() 로 옵션 다이얼로그 닫기
data class ItemData(
val id: String, val name: String, val price: String, var count: Int,
val selectedHotIceOption: String, val optShotName: String, val optShotPrice: Int
) {
}
lateinit var lyj_adapter: RecyclerViewAdapter
lateinit var lyj_itemList: ArrayList<ItemData>
// 초기화
lyj_itemList = ArrayList()
// 리사이클러뷰 데이터 표시
lyj_adapter = RecyclerViewAdapter(
lyj_itemList,
::updateTotalPrice
) // ::updateTotalPrice 함수 참조 - 총 가격 업데이트
// 어댑터 설정
lyj_recyclerView.adapter = lyj_adapter
// 아이템 수직 배치
lyj_recyclerView.layoutManager = LinearLayoutManager(this)
updateTotalPrice()
- lyj_itemList 리스트는 주문한 아이템의 정보를 저장하는 데 사용
- RecyclerViewAdapter 객체를 생성하여 주문한 아이템 리스트와 총 가격을 업데이트하는
updateTotalPrice 함수를 매개변수로 받음
- lyj_adapter는 데이터 변경을 감지하여 리사이클러뷰를 업데이트
- lyj_recyclerView 어댑터에 lyj_adapter를 설정하여 주문한 아이템이 리사이클러뷰에 표시되도록 설정
- layoutManager 로 아이템이 수직으로 배치되도록 설정
fun addNewItem(itemData: ItemData) {
// ItemData 객체를 전달받아서 리스트에 추가하기
lyj_itemList.add(itemData)
lyj_adapter.notifyItemInserted(lyj_itemList.size - 1)
lyj_adapter.notifyDataSetChanged()
updateTotalPrice()
resetCountDown()
}
- 전달받은 itemData를 lyj_itemList에 추가하여 새로운 아이템이 리스트에 저장
- lyj_adapter에 notifyItemInserted를 통해 새로운 아이템이 추가되었음을 알림
- 리사이클러뷰에 아이템이 추가되고 새로운 아이템이 표시됨
- notifyDataSetChanged()를 통해 어댑터에게 데이터가 변경되었음을 알리며 이를 통해 어댑터는 변경된 데이터를 다시 로그
class RecyclerViewAdapter(
private val itemList: ArrayList<ItemData>,
private val updateTotalPrice: () -> Unit
) :
RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {}
- MainActivity 에서 아이템 리스트와 updateTotalPrice() 형태로 정보 전달 받음
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
// 아이템 데이터 가져오기
val item = itemList[position]
// 뷰홀더에 데이터 설정
holder.nameTextView.text = item.name
holder.priceTextView.text = (item.price.toInt() * item.count).toString()
holder.lyj_cnt.text = item.count.toString()
holder.lyj_optionPlusShot.text = item.optShotName
holder.lyj_optionPlusShotPrice.text = (item.optShotPrice * item.count).toString()
holder.lyj_optionHotIce.text = item.selectedHotIceOption
// 아이디가 디저트인경우 해당 옵션 리니어 보이지 않도록
if (item.id.contains("dessert")) {
// 생략
}
// 수량 변경에 의한 가격 변경
holder.lyj_minusBtn.setOnClickListener {
if (item.count > 1) {
item.count--
holder.lyj_cnt.text = item.count.toString()
holder.priceTextView.text = (item.price.toInt() * item.count).toString()
holder.lyj_optionPlusShotPrice.text = (item.optShotPrice * item.count).toString()
updateTotalPrice()
}
}
holder.lyj_plusBtn.setOnClickListener {
// 생략
}
}
- 리사이클러뷰 xml에 해당 위치에 있는 전달받은 아이템 데이터를 가져와서 표시
- 디저트인 경우 해당 옵션이 보이지 않도록 설정
- "-", "+" 수량 변경 버튼 클릭시 변경되는 코드 설정
fun updateTotalPrice() {
val totalPrice = lyj_adapter.getTotalPrice()
// Count 저장
val totalCount = lyj_adapter.getTotalCount()
lyj_totalPrice.text = totalPrice.toString()
lyj_totalCount = totalCount
}
- RecyclerViewAdapter.kt 에 존재하는 getTotalPrice(), getTotalCount() 함수를 호출하여 총 가격, 총 수량 반환
- 총 수량을 lyj_totalCount 변수에 저장 (총 주문 목록 다이얼로그에 사용 예정)
lyj_recyMenuDel.setOnClickListener {
val position = adapterPosition
if (position != RecyclerView.NO_POSITION) {
// MainActivity 접근
(itemView.context as MainActivity).lyj_itemList.removeAt(position)
(itemView.context as MainActivity).lyj_adapter.notifyItemRemoved(position)
(itemView.context as MainActivity).updateTotalPrice()
}
}
- adapterPosition으로 현재 ViewHolder의 위치를 가져옴
- if 문으로 현재 위치가 유효한 위치인지 확인하여 removeAt으로 해당 위치 아이템 제거
- notifyItemRemoved로 어댑터에게 해당 아이템이 삭제되었음을 알려 업데이트 수행
- updateTotalPrice를 호출하여 총 가격 업데이트
private fun checkListAndHandleButton() {
if (lyj_itemList.isEmpty()) {
Toast.makeText(applicationContext, "메뉴를 선택해 주세요.", Toast.LENGTH_SHORT).show()
} else {
// 리스트가 존재한다면 아이템 정보 넘기기
val dialog = listDialog(
lyj_itemList,
lyj_totalPrice.text.toString(),
lyj_totalCount.toString()
)
dialog.show(this.supportFragmentManager, "CustomDialog")
}
}
- 버튼에 클릭 이벤트 부여
- 리스트가 비어있다면 토스트 메세지 출력
- 리스트가 존재한다면 listDialog()에 주문한 리스트 정보 전달