LazyColumn에 항목이 dismissed된 채로 추가되는 현상

th.k·2023년 2월 3일
0

LazyColumn + SwipeToDelete를 사용한 Todo 리스트 화면을 만들면서 겪은 일


상황

Room을 사용해서 가져온 Todo 아이템들을 LazyColumn을 통해서 화면에 리스트로 보여주고 있었다. 각 항목을 왼쪽으로 swipe하면 삭제할 수 있고, 삭제했을 때 뜨는 SnackBar 알림의 'UNDO' 버튼을 클릭하면 방금 삭제한 아이템을 다시 DB에 추가해서 화면에 다시 보여줄 수 있는 기능이 있다.

그런데 삭제한 아이템을 다시 DB에 추가해서 화면에 표시할 때, LazyColumn의 아이템이 swipe된 상태(dismissed) 그대로 다시 추가되는 현상이 발생했다.

원인

  1. DB에 방금 삭제한 Todo 데이터를 다시 추가한다고 했는데, 여기서 각 Todo 아이템의 primaryKey인 id도 그대로 DB에 다시 추가하고 있었다.
  2. 그리고 LazyColumn에서는 Todo 아이템의 id를 items(...)의 key값으로 사용하고 있었다.

다시 추가된 Todo 데이터의 id가 dismissed된 항목의 id와 같기 때문에 마지막 상태(dismissed) 그대로 다시 화면에 항목이 보이게 된 것이다.

해결

DB에 데이터를 다시 추가할 때 id 값을 0으로 변경하고 넣어줬더니 해당 현상은 사라졌다.

똑같은 key값으로 항목이 다시 추가되면 마지막 상태 그대로 항목이 표시될 줄은 몰랐다......

profile
고생끝에롹이온다

0개의 댓글