리사이클러뷰를 이용해서 아이템마다 체크박스를 달아주고 아이템에 대한 체크박스 이벤트를 처리해야 했다.
아이템을 체크하고 스크롤을 내리다가 올라가면 원래 위치에 해당하는 체크박스에 대한 이벤트 처리가 사라진 것을 확인할 수 있었다.
왜???
일정 스크롤 이상으로 움직이면
리사이클러뷰가 아이템을 재생성하기 때문이었다. 즉 viewHolder가 재활용돼서 생긴 문제라고 판단했다.
이미 Bind를 통해서 아이템을 생성했지만 스크롤을 위아래로 이동하면 아이템을 다시 배치하는 것을 확인할 수 있었다.
실제로는 아이템에 대해서 체크박스가 체크가 되어있지만 아이템을 다시 할당하면서 체크박스가 해제된 모습으로 보인 것이다.
해결 방안
해결하기 위해서 다양한 방법이 있지만, 데이터 클래스의 체크박스 상태를 저장할 변수를 만들어서 체크박스의 상태와 일치화시켰다.
기존 코드는
class BoardListViewHolder(
private val binding: ItemBoardBinding,
private val boardClickListener: BoardClickListener?,
) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: Board) {
with(binding) {
board = item
imgbtnBoardItem.setOnClickListener {
boardClickListener?.onClick(item)
}
cbBoard.setOnClickListener {
boardClickListener?.onCheckBoxClick(item)
}
}
}
}
다음과 같이 아이템에 대한 체크박스의 상태를 알 수 없었다.
data class Board(
val id: String,
val name: String,
val date: LocalDate,
val imageUrl: String,
var isChecked: Boolean = false,
)
data class에서 체크박스의 상태를 저장할 boolean 변수를 만들었다.
체크박스가 체크된다면 isChcekd가 true이고 이는 체크박스의 상태도 true라는 뜻이다.
class BoardListViewHolder(
private val binding: ItemBoardBinding,
private val boardClickListener: BoardClickListener?,
) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: Board) {
with(binding) {
board = item
cbBoard.isChecked = item.isChecked
imgbtnBoardItem.setOnClickListener {
boardClickListener?.onClick(item)
}
cbBoard.setOnClickListener {
item.isChecked = !item.isChecked
boardClickListener?.onCheckBoxClick(item)
}
}
}
}
체크박스가 체크되었다면 item의 isChecked를 변경시켜 줬다.
이렇게 코드를 수정하고 체크박스를 하고 스크롤을 내리고 올려보니 아이템이 재생성되더라도 checked의 상태에 따라
체크박스의 상태를 유지할 수 있었다.
느낀 점
다양한 방법이 있지만 Item의 isChcekd라는 Boolean 변수를 두고, checkBox가 클릭될 때마다 isChecked의 값을 바꿔주고,
bind가 다시 호출되더라도, checkBox의 상태를 item의 isChecked와 일치시키는 것이 가장 편한 방법인 것 같다.
혹시 다른 방법이 있으려나...?
'Skils > Android' 카테고리의 다른 글
[Android] - Activity 와 Fragment를 나누는 기준 (1) | 2024.01.11 |
---|---|
[Android] - ListAdapter (0) | 2023.12.11 |
[Android] - CustomView DrawText (0) | 2023.12.10 |
[Android] - Navigation Component(2) (1) | 2023.12.06 |
[Android] Github action을 이용한 CD(Firebase App Distribution) (3) | 2023.11.27 |