퉁탕퉁탕 만들어보자

Android RecyclerView 본문

Computer/Android

Android RecyclerView

호숀티 2022. 5. 5. 18:31
반응형

어떤 아이템이 언제 바인딩/어태치/디태치/리사이클 되는가?

@NonNull
@Override
public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    EwImageItemBinding binding =
            EwImageItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
    View view = binding.getRoot();
    ImageViewHolder holder = new ImageViewHolder(view, binding);
    Log.e(TAG, "onCreateViewHolder: " + holder.getAdapterPosition());
    return holder;
}

처음 recycler뷰를 넣고 화면에는 0~2 포지션의 아이템만 보이는 상태는 다음과 같다.

 

E/ImageAdapter: onCreateViewHolder: -1
E/ImageAdapter: onBindViewHolder : 0
E/ImageAdapter: onViewAttachedToWindow : 0

처음 holder를 생성했을 때는 position이 전부 -1이다. 

생성 -> 바인드 -> 어태치 순으로 호출되는 것을 확인할 수 있다.

 

처음 recycler뷰에 item을 추가하면 추가된 itemlist 를 전부 바인드한다. (140개짜리를 list를 넣었더니 전부 한꺼번에 bind후 attach까지 실행)

E/ImageAdapter: onCreateViewHolder: -1
E/ImageAdapter: onBindViewHolder : 139
E/ImageAdapter: onViewAttachedToWindow : 139

그리고 화면에 보이지 않는 3~ 139 포지션의 아이템에 대해서 순차적으로 detach -> recycle 이 된다.

E/ImageAdapter: onViewDetachedFromWindow: 3
E/ImageAdapter: onViewDetachedFromWindow: 4
E/ImageAdapter: onViewDetachedFromWindow: 5
E/ImageAdapter: onViewRecycled: 3
E/ImageAdapter: onViewDetachedFromWindow: 6
E/ImageAdapter: onViewRecycled: 4
E/ImageAdapter: onViewDetachedFromWindow: 7
E/ImageAdapter: onViewRecycled: 5

...

E/ImageAdapter: onViewDetachedFromWindow: 137
E/ImageAdapter: onViewRecycled: 135
E/ImageAdapter: onViewDetachedFromWindow: 138
E/ImageAdapter: onViewRecycled: 136
E/ImageAdapter: onViewDetachedFromWindow: 139
E/ImageAdapter: onViewRecycled: 137

 

 

이상태에서 스크롤을 내려서 2,3,4번이 보이게 만들면

 

E/ImageAdapter: onBindViewHolder : 3
E/ImageAdapter: onViewAttachedToWindow : 3
E/ImageAdapter: onBindViewHolder : 4
E/ImageAdapter: onViewDetachedFromWindow: 0
E/ImageAdapter: onViewRecycled: 138
E/ImageAdapter: onViewDetachedFromWindow: 1
E/ImageAdapter: onViewRecycled: 139
E/ImageAdapter: onViewAttachedToWindow : 4
E/ImageAdapter: onBindViewHolder : 5

3,4 가 bind -> attach 되고 0,1이 detach되는것을 확인할 수 있다.

그리고 5는 bind만 되고 attach는 안됬다.

그리고 맨 마지막의 onViewRecycled는 맨 아래에 있었는데 리사이클이 되지 않은 138,139 가 리사이클되었다.

 

1-1 GRID인 경우.. 역시 보이는것/안보이는것으로 동일하게 동작한다.

 

notifyDataSetChanged()

 

adapter에게 dataset이 change되었다는것을 알려준다. 현재 보여지고 있는 item에 대해서만 bind -> attach 가 불린다.

그 외에도 단 하나의 변경을 알려주는 다양한 함수들이 있다.

public final void notifyItemChanged(int position)
 public final void notifyItemChanged(int position)
public final void notifyItemInserted(int position)
public final void notifyItemMoved(int fromPosition, int toPosition)

2. https://medium.com/hongbeomi-dev/%EB%B2%88%EC%97%AD-recyclerview%EC%9D%98-%EB%82%B4%EB%B6%80-%EB%8F%99%EC%9E%91-941a2827fa5a

 

[번역] — RecyclerView의 내부 동작

본 글을 Niharika Arora님의 글을 한국어로 번역한 글입니다. 원문 링크👇

medium.com

 

3. https://medium.com/@bansooknam/android-recyclerview-%EC%9A%94%EC%95%BD-aaea4a9c95e7

 

Android RecyclerView 요약

1. 구성요소

medium.com

 

4. 섞인다

getItemCount()까지만 override하면 아이템들이 마구 뒤섞이게 된다. 이때 해결법은 getItemId를 리턴해주는것이다. position이 뭘까?

@Override
public long getItemId(int position) {
    return position;
}

 

728x90
반응형

'Computer > Android' 카테고리의 다른 글

Android Rendering?  (0) 2022.05.08
Android View LifeCycle  (0) 2022.05.07
ViewModel  (0) 2022.04.24
Android Process And Thread  (0) 2022.04.24
Content Provider, Content Resolver, Content Observer  (0) 2022.04.23