일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 쌓기게임
- DataStructure
- devicedriver
- 피보나치
- memory
- Kotlin
- stack
- LRU
- SPI
- QoS
- math
- Dialog
- Dokka
- synergy
- Collection
- darkmode
- Java
- AfxMessageBox
- 코인거스름돈
- 리틀포레스트
- WebView
- 동적프로그래밍
- 형변환
- 보늬밤
- MFC
- 피요모리2
- DynamicProgramming
- 제곱근
- android
- FirebaseAuth
- Today
- Total
퉁탕퉁탕 만들어보자
Android RecyclerView 본문
어떤 아이템이 언제 바인딩/어태치/디태치/리사이클 되는가?
@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)
[번역] — 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;
}
'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 |