Android/StoreInfo

<정리> 사과마켓 앱 구현 3

re트 2024. 1. 8. 19:42
728x90

아마 오늘로 마무리가 될 거 같다.

왜냐하면 마지막 선택과제가 오늘 마무리가 됐기 때문이다.

 

1. Snackbar 생성

이 부분은 아주 간단했다.

디테일 페이지에서 하트 버튼을 누를 때 스낵바를 만들고 애니메이션 설정하고 띄우면 됐다.

val snackbar = Snackbar.make(
    it,
    getString(R.string.snackbar_detail_favorite_comment), 
    Snackbar.LENGTH_SHORT
)
snackbar.animationMode = Snackbar.ANIMATION_MODE_FADE
snackbar.show()

 

2. 좋아요 처리

어떻게 이걸 처리할까 고민을 하다가 가장 먼저 data class MarketItem에 Boolean 타입의 isClicked라는 변수를 추가했다.

이 변수를 통해 하트 이미지를 어떤 걸로 할지와 좋아요 숫자를 변경하기 위해서다.

 

메인 페이지에서 디테일 페이지로 넘어갈 때 MarketItem 객체를 넘겼고 startActivity로 전환하는 게 아니라 ActivityResultLauncher를 사용해서 전환했다.

override fun onClick(view: View, position: Int) {
    var intent = Intent(this@MainActivity, DetailActivity::class.java)
    intent.putExtra("item", dataList[position])
    resultLauncher.launch(intent)
}

값을 받아올 게 있었기 때문이다.

받을 때도 객체로 받고 isClicked 값을 수정했다.

그리고 화면을 새로 구성했다.

이러한 스킬은 저번 팀플 때 팀원 중 한 명이 한 방법이었다... 였는데 새로운 방법이 방금 떠올라서 적용했더니 됐다.

바로 어댑터에 데이터가 변경되었음을 알려주는 것이다.

그러기 위해서 지역 변수였던 어댑터를 전역변수로 뺐고 데이터 변경되는 코드 이후에 adapter.notifyDataSetChanged()를 호출했다.

동일한 동작을 보였다.

 

이제는 디테일 페이지에서 한 거다.

먼저 뷰들을 세팅할 때 넘어온 MarketItem 객체의 값들로 했는데 좋아요 버튼 이미지만 isClicked 속성을 보고 결정했다.

좋아요 버튼을 누를 때는 isClicked 상태를 보고 이미지와 isClicked 값을 변경했다.

또한 isClicked가 false일 때는 스낵바도 만들었다.
이렇게 한 다음 뒤로가기 버튼을 눌렀을 때 이 값이 메인 페이지에서도 적용될 수 있도록 인텐트로 사용한 객체를 그대로 다시 돌려보냈다.

binding.ivDetailArrowBackBtn.setOnClickListener {
    intent.putExtra(EXTRA_MARKET_ITEM, item)
    setResult(RESULT_OK, intent)
    finish()
}

 

마지막으로 ItemAdapter에서 한 거다.

여기서는 그저 onBindViewHolder에서 isClicked 값에 따라 이미지와 좋아요 값을 변경시켰다.

if (items[position].isClicked) {
    holder.ivItemFavorite.setImageResource(R.drawable.ic_recycler_fill_heart_btn)
    holder.tvItemFavoriteCount.text = (items[position].favoriteCount + 1).toString()
} else {
    holder.ivItemFavorite.setImageResource(R.drawable.ic_recycler_empty_heart_btn)
    holder.tvItemFavoriteCount.text = items[position].favoriteCount.toString()
}

 

3. 문제 & 해결

디테일 페이지에서 인텐트로 넘긴 객체를 받지 못하고 null만 뜨는 문제가 있었는데 그건 내가 그냥 인텐트를 받을 때처럼 intent.getParcelableExtra를 써서 그런 거였다.

result?.data?.getParcelabeExtra를 쓰니까 잘 받을 수 있었다.ㅎㅎ

 

위의 문제를 해결하고 여러번 과정을 반복해봤는데 갑자기 리사이클러뷰 아이템이 엄청 늘어나는 문제가 있었다.

이건 내가 새로 화면을 덮을 때 생기는 문제였고 initialSettings 함수 안에 있는 setMarketItem 함수 때문이었다.

이걸 밖으로 빼니까 해결이 됐다.

물론 지금은 adapter.notifyDataSetChanged()를 사용하기 때문에 깔끔하게 다시 안으로 넣었다.

 

ItemAdapter에서 좋아요 숫자 텍스트를 지정할 때 처음에 setText를 쓰려고 했는데 에러가 떴었다.

그래서 text로 바꾸고 뒤에 toString을 붙이는걸로 변경했는데 해결되더라...?

반응형