payload
payload란 아이템의 변경 사항에 대한 부분 업데이트를 위해 사용되는 객체이다.
즉, 어댑터의 onBindViewHolder()가 호출될 때 넘겨 받는 파라미터이다.
payload의 목적은 RecyclerView 내의 아이템 변경 시 전체 아이템 뷰를 재바인딩 하지 않으며,
변경된 부분만 업데이트 하는 것에 있다.
onBindViewHolder(ViewHolder holder, int position, List<Object> payloads)
payloads는 List<Object> 타입의 파라미터로 변경 사항에 대한 정보를 담고 있는 객체의 집합이다.
payload는 Object 객체이기 때문에 기본 자료형(int, float, double, long)을 제외한
어떤 객체든 payload로 전달할 수 있다.
예시
RecyclerView의 아이템 중 하나인 "좋아요" 수와 "코멘트" 수가 변경되었을 때
이를 어댑터에 알리고, 해당 아이템 뷰만 업데이트 하는 과정을 살펴보자
public class ItemUpdatePayload {
public final int likesCount;
public final int commentsCount;
public ItemUpdatePayload(int likesCount, int commentsCount) {
this.likesCount = likesCount;
this.commentsCount = commentsCount;
}
}
위와 같이 사용자 정의 payload의 객체가 존재한다.
ItemUpdatePayload payload = new ItemUpdatePayload(newLikesCount, newCommentsCount);
notifyItemChanged(position, payload);
사용자가 좋아요 수와 코멘트 수를 변경 했다고 가정하고,
새로운 객체를 생성하여 notifyItemChanged()를 호출해보자
{
아이템 1: {
"좋아요 수": 5,
"코멘트 수": 3
}
}
위의 ItemUpdatePayload 객체는 하나의 아이템에 대한 여러 변경사항을 포함하는 단일 객체로 구성될 것이다.
변경 사항은 하나의 payload로 notifyItemChanged 메서드를 통해 전달되고, onBindViewHolder 메서드에서 처리된다.
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) {
if (!payloads.isEmpty()) {
for (Object payload : payloads) {
if (payload instanceof ItemUpdatePayload) {
ItemUpdatePayload updatePayload = (ItemUpdatePayload) payload;
// 좋아요 수 업데이트
holder.likesTextView.setText(String.valueOf(updatePayload.likesCount));
// 코멘트 수 업데이트
holder.commentsTextView.setText(String.valueOf(updatePayload.commentsCount));
}
}
} else {
// 전체 아이템 뷰 업데이트
super.onBindViewHolder(holder, position, payloads);
}
}
onBindViewHolder에서 단일 객체로서 넘겨받는다.
payloads 리스트를 순회하며, ItemUpdatePayload 타입의 객체를 찾아 해당하는 속성을 업데이트 한다.
=> 부분 업데이트를 통한 성능 최적화
'Android' 카테고리의 다른 글
[Android] Fragment 생성 방법 정리 / newInstance() (0) | 2024.03.02 |
---|---|
[Android] RecyclerView - ViewHolder의 재사용과 상태 관리의 중요성 (선택 이벤트 처리) (0) | 2024.03.01 |
[Android] RecyclerView를 update하는 메소드 (0) | 2024.02.28 |
[Android] RecyclerView - GridLayout 구현하기 (1) | 2024.02.27 |
[Android] Retrofit2 통신과정과 사용법 / JSON 파일 받아오기 (0) | 2024.02.22 |