Android 공부/RecyclerView
RecyclerView
posite
2026. 2. 20. 13:30
RecyclerView
- ListView처럼 데이터 집합을 개별 아이템 단위로 구성하여 출력하는 ViewGroup이고, 한 화면에 표시되지 않는 많은 데이터를 스크롤 되는 리스트로 표시한다
- ViewHolder 패턴을 강제하여 대량의 데이터를 효율적으로 화면에 표시함
- 보이는 항목만 View를 생성하고 새로운 아이템을 dirty view에 바인딩 하여 재사용함
- layoutManager를 사용하여 수직, 수평, grid등 다양한 layout을 쉽게 설정 할 수 있음
- ItemAnimator를 사용하여 지정할 수 있다 ItemDecorator를 이용하여 여백, 그림자 효과등도 적용할 수 있음
주의할 점
- 모든 아이템을 notify하는것은 되도록 피해라( notifyItemRangeChanged(0, getItemCount()); ->
해결 방법 : notifyItemChanged(3) - onBindViewHolder 안에 position을 사용하지 말라. (final인 position은 보장하지 않는다. 위치가 바뀌거나 지워질때 등)
-> 해결방법 : holder.getAdapterPosition을 이용해라. -> getAbsoluteAdapterPosition을 사용하도록 권고 - holder.getAdapterPosition()해서 가져온 position값이 RecyclerView.NO_POSITION인지 꼭 확인하도록 해라.
-> 방법. if(holder.getAdapterPosition()!=RecyclerView.NO_POSITION)인지 확인하고 필요한 로직 추가. - Item Payload를 활용하라. -> 방법. adapter.notifyItemChanged(position, LIKE_UPDATE); (좋아요 눌렀을때 처리, 타입을 여러개로 나눠서 필요한 호출을 한다.) onBindViewHolder(holder, position, List payloads)를 override해서 사용하고 payloads.contains(LIKE_UPDATE) 함수로 좋아요를 눌렀는지 판단해서 로직 처리가 가능하다.
- onCreateViewHolder에서는 새로운 인스턴스만 반환해라. -> 전역변수로 holder를 keep했다가 캐시처럼 넘기는 오류는 범하지 말라. 항상 new Holder()를 반환하도록 해라.
- pool을 메모리 캐시에 놓고 모든 recyclerview에 세팅하지 말라. : context leak를 유발하게 될것.
- recyclerView adpater는 single쓰레드 기반이다. -> 영향을 주는 list들은 main Thread에서만 변경하도록 해야 정상 동작한다.