오늘은 RecyclerView의 Payload에 대해서 글을 작성해볼게요.
기본적으로 다들 RecyclerView를 사용해보셨을거에요.
그러면서 보통은 notifyDataSetChanged() 로 전체 갱신 때려버리는 경우가 많은데 성능 상으로 좋은 방법은 아니죠.
특정 position만 갱신할 때에는 notifyItemChanged(position) OR notifyRangeChanged(positionStart, itemCount)를 사용해야합니다.
onBindViewHolder에서 생성된 뷰홀더를 재사용하여 position에 맞게 바인딩 처리를 하고 있는건 모두 알고 계실거에요.
그런데 모든 View를 업데이트 하지 않고 특정 View만 애니메이션 처리 및 text만 변경하는 작업을 하고 싶을때 조건문으로 처리할 필요성이 생깁니다.
그러면서 생긴게 RecyclerView의 payload 기능이 추가 되었어요.
사용법은 notifyItemChanged(position, payload) OR notifyRangeChanged(positionStart, itemCount, payload)로 넘겨주어 onBindViewHolder에서 이를 처리하면 되는데요.
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
// 초기화 처리
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads);
}else {
for (Object payload : payloads) {
// 하고자하는 특정 처리 추가
}
}
}
이렇게 사용할 수있습니다.
List타입으로 오는것에 의아할 수 있는데요.
해당 포지션에 payload를 여러개를 전달할 수가 있어요. 그렇게 되면 onBindViewHolder에서 묶어서 list로 전달해줍니다.
예를들면 animationPayload라는게 있고 textChangePayload 두가지가 있다고 생각하시면 해당 페이로드만 instanceOf(java), is(kotlin)으로 잡아내서 원하는 처리를 하실 수 있습니다.
이제 주의할 점이 있는데요.
payload를 분명 실어 넣었는데!! 왜 안오고 empty payload만 오는가? 의문이 생길 수 있어요.
왜냐면 제가 그랬거든요;
이유는 간단히 말해서 뷰가 attach 된 상태에만 유효하고 그렇지 않을때는 날려버리기 때문입니다.
viewHolder가 A에서 B로 바뀔때 뭔가 처리를 payload로 하고 싶다! 가 안되는거에요~
A에서 A로 가지만 전체적으로 업데이트 할 필요가 없을때 그때 사용하면 됩니다.
글 읽어주셔서 감사합니다~
'안드로이드' 카테고리의 다른 글
안드로이드 include vs merge 태그 차이 (0) | 2021.04.14 |
---|---|
AlertDialog (0) | 2021.03.21 |
안드로이드 접근성 accessibility 에 관하여 (0) | 2021.02.07 |
Android Room (0) | 2021.01.18 |
IPC 를 위한 Serializable, Parcelable, Parcel, 그리고 Bundle 까지 (0) | 2020.02.28 |