728x90
반응형
RecyclerView 데이터 추가/삭제/수정 반영 방법
RecyclerView를 사용할 때 데이터를 삭제/수정/추가하는 일이 일어날 수 있다.
메모앱을 만들면서 메모를 추가/삭제/수정하는 기능이 필요했고, 이번 게시물에서는 바뀐 데이터를 RecyclerView에 반영하는 방법을 알아보고자 한다.
RecyclerView 와 dataList
- RecyclerView는 아이템 뷰를 재활용해 각 데이터들을 나타내기 때문에 뷰에 내용을 담을 데이터리스트가 필수다.
- 따라서 RVAdpater를 만들 때 매개변수로 dataList를 전달해준다.
- 이 때 dataList에 일어날 수 있는 상황은 크게 3가지가 있다.
dataList에 data가 추가되는 상황
- 새로운 data가 dataList에 추가된 것이다.
- dataList.add(data) 한다.
- notifyItemInserted 사용한다
- notifyItemInserted(position:Int) → 새롭게 삽입된 아이템의 위치를 넣어 데이터리스트가 벼경되었음을 알린다.
- notifyItemRangeInserted 사용한다.
- notifyItemRangedInserted(positionStart:Int, itemCount : Int)
- 삽입된 첫번째 아이템의 위치와, 삽입된 아이템의 개수를 넘겨주어 데이터가 변경되었음을 알린다.
- notifyItemRangedInserted(positionStart:Int, itemCount : Int)
dataList에 data가 삭제된 상황
- data가 dataList에서 삭제된 것이다.
- dataList.remove(data) 한다.
- notifyItemRemoved(position:Int) → 삭제된 아이템의 위치를 넘겨주어 데이터가 삭제되었음을 알린다. (아이템 1개를 삭제 할 때 사용한다.)
- notifyItemRangeRemoved 사용한다.
- notifyItemRangeRemoved(positionStart:Int, itemCount:Int) → 첫번째로 삭제된 아이템의 위치와 삭제된 아이템의 개수를 넘겨 데이터 리스트에 데이터가 삭제되었음을 알린다.
dataList에 data가 수정된 상황
- 기존 dataList에 쓰여있던 data의 값이 변경된 것이다.
- dataList.set(position,변경 data) 를 한다. (position 위치의 data를 매개변수로 넘긴 data로 변경하겠다는 뜻이다)
- notifyItemChanged를 사용한다.
- notifyItemChanged(position:Int) : 변경된 아이템의 위치를 넘겨주어 데이터가 변경되었음을 알린다.
이 글을 쓰게 된 이유
- 사실 모든 data의 상황을 notifyDataSetChanged로 처리했었다. (이 메서드에 대한 이해가 부족했던거같다. . . 그냥 리스트의 변경을 알리는 메서드 정도로 생각했다.)
- notifyDataSetChanged는 리스트의 크기와 아이템이 둘다 변경되는 경우에 사용하는 것으로 추가 삭제 수정과같이 리스트의 크기만 바뀌거나 아이템만 바뀌는 상황에서는 사용하기에 비효율적이다.
- 리스트의 크기와 아이템 모두 바뀌는 상황에 적용되기에 호출시 리스트를 새롭게 그리기 때문이다. 한 블로그의 비유에 의하면 빙고게임을 할 때 판마다 빙고판을 다시 만들 필요가 없는것과 마찬가지라는거다. .
- 따라서 모든 상황에 다 적용이 가능하지만 효율성을 따져보았을때 각 상황에 맞는 메서드를 사용하는게 좋을거같다.
728x90
반응형
'Android > 공부' 카테고리의 다른 글
[Android] Recyclerview item Click / Click Listener 등록하는 법 (0) | 2022.11.01 |
---|---|
[Android] RecyclerView란? / RecyclerView Adapter 사용법 (0) | 2022.10.26 |
[Android] 안드로이드 기본 dialog 생성하기 (0) | 2022.10.25 |
[Android] Activity와 Fragment 생명주기 (1) | 2022.10.25 |
[Android 오류] error: failed linking file resources (0) | 2022.10.12 |