[안드로이드] 키오스크 만들기(3) - 주문 추가

YJ·2023년 8월 24일
0
post-thumbnail

3. 주문 추가

화면 설명

메뉴 옵션 선택 후 주문 담기 버튼을 누르게 되면 나오는 화면
각 메뉴의 수량을 변경하여 해당 아이템의 가격, 옵션 가격, 총금액이 변경되는 모습 확인 가능
각 아이템 삭제 및 전체 삭제 가능
만약 주문하지 않은 상태로 결제하기 버튼 클릭시 메뉴 선택하라는 토스트 메시지 출력
주문한 경우 결제 버튼 클릭시 총주문한 목록을 한 번에 볼 수 있는 다이얼로그 창으로 화면 전환


✅ 1) 옵션 다이얼로그의 주문담기 버튼 클릭하여 리스트 넘기기

  • 옵션 페이지에서 전달할 정보 구하기 (optionDialog.kt)
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 ""

  • ItemData에 정보 전달하기 (optionDialog.kt)
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() 로 옵션 다이얼로그 닫기

  • ItemData.kt 형태 (주문한 아이템의 정보를 저장)
data class ItemData(
    val id: String, val name: String, val price: String, var count: Int,
    val selectedHotIceOption: String, val optShotName: String, val optShotPrice: Int
) {
}

✅ 2) 주문한 아이템 추가

  • MainActivity.kt
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 로 아이템이 수직으로 배치되도록 설정

  • MainActivity.kt 의 addNewItem()
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()를 통해 어댑터에게 데이터가 변경되었음을 알리며 이를 통해 어댑터는 변경된 데이터를 다시 로그

✅ 3) 주문한 아이템이 표시되는 RecyclerViewAdapter

  • RecyclerViewAdapter.kt
class RecyclerViewAdapter(
    private val itemList: ArrayList<ItemData>,
    private val updateTotalPrice: () -> Unit
) :
    RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {}
- MainActivity 에서 아이템 리스트와 updateTotalPrice() 형태로 정보 전달 받음

  • 리사이클러뷰의 각 아이템 뷰에 데이터를 바인딩하여 표시하는 onBindViewHolder
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에 해당 위치에 있는 전달받은 아이템 데이터를 가져와서 표시
- 디저트인 경우 해당 옵션이 보이지 않도록 설정
- "-", "+" 수량 변경 버튼 클릭시 변경되는 코드 설정

  • 총 가격 업데이트 updateTotalPrice()

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 변수에 저장 (총 주문 목록 다이얼로그에 사용 예정)

  • 해당 아이템 삭제하는 경우 (ViewHolder 내부 코드)
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를 호출하여 총 가격 업데이트

✅ 4) 결제하기 버튼 클릭 이벤트

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()에 주문한 리스트 정보 전달
profile
함께 배워나가고 싶습니다!

0개의 댓글

관련 채용 정보