[Android] RecyclerView 메소드에서의 payload
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 타입의 객체를 찾아 해당하는 속성을 업데이트 한다.
=> 부분 업데이트를 통한 성능 최적화