RecyclerView의 아이템이 변경되거나 추가, 삭제 등이 되었을 경우 RecyclerView에 반영하는 방법에 대해 정리해보려 한다. RecyclerView를 업데이트 하기 위해서는 내용 변경 후 Adapter에 알려주면 된다.
notifyDataSetChanged()
기본적으로 변경 사항에 대한 내용을 지정하지 않으므로 모든 아이템과 구조가 유효하지 않다고 가정하고 업데이트를 하므로 성능 측면에서의 효율성은 떨어진다.
notifyItemChanged(position: Int)
아이템 한 개의 내용이 변경 되었을 경우 사용한다.
position
: 변경 된 아이템의 위치
notifyItemChanged(position: Int, payload: Obejct)
position
: 변경 된 아이템의 위치payload
: onBindViewholder()가 호출될 때 넘겨받을 수 있는 객체이며 특정 position의 내용을 payload 값으로 구분하여 업데이트 할 때 사용한다.
notifyItemRangeChanged(positionStart: Int, itemCount: Int)
연속 된 여러 개의 아이템의 내용이 변경 되었을 경우 사용한다.
positionStart
: 변경 된 아이템의 시작 위치itemCount
: 변경 된 아이템의 개수
notifyITemRangeChanged(positionStart: Int, itemCount: Int, payload: Obejct)
positionStart
: 변경 된 아이템의 시작 위치itemCount
: 변경 된 아이템의 개수payload
: onBindViewholder()가 호출될 때 넘겨받을 수 있는 객체이며 특정 position의 내용을 payload 값으로 구분하여 업데이트 할 때 사용한다.
notifyItemInserted(position: Int)
아이템 한 개를 새로 추가할 경우 사용한다.
position
: 추가 된 아이템의 위치
notifyItemRangeInserted(positionStart: Int, itemCount: Int)
연속 된 아이템을 추가할 경우 사용한다.
positionStart
: 추가 된 아이템의 시작 위치itemCount
: 추가 된 아이템의 개수
notifyItemMoved(fromPosition: Int, toPosition: Int)
한 개의 아이템 위치를 이동할 경우 사용한다.
fromPosition
: 기존 아이템의 위치toPosition
: 변경 될 아이템의 위치
notifyItemRemoved(position: Int)
한 개의 아이템을 삭제할 경우 사용한다.
position
: 삭제할 아이템의 위치
notifyItemRangeRemoved(positionStart: Int, itemCount: Int)
연속 된 여러 개의 아이템을 삭제 할 경우 사용한다.
positionStart
: 삭제할 아이템의 시작 위치itemcount
: 삭제할 아이템의 개수
val items = loadList() // 아이템 리스트
val adapter = ProductAdapter(items) // 어댑터 생성
// RecyclerView에 어댑터 연결
binding.productRecyclerView.run {
layoutManager = LinearLayoutManager(this@MainActivity)
addItemDecoration(
DividerItemDecoration(
this@MainActivity,
LinearLayoutManager.VERTICAL
)
)
this.adapter = adapter
}
adapter.itemClick = object : ProductAdapter.ItemClick { // 아이템 클릭시 삭제
override fun onItemClick(view: View, position: Int) {
adapter.notifyItemRangeRemoved(position, items.size)
}