Android

[Android] RecyclerView 메소드에서의 payload

도우 2024. 2. 28. 14:31
728x90

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 타입의 객체를 찾아 해당하는 속성을 업데이트 한다.
=> 부분 업데이트를 통한 성능 최적화

 

728x90