posite 2026. 2. 20. 13:30

RecyclerView

  • ListView처럼 데이터 집합을 개별 아이템 단위로 구성하여 출력하는 ViewGroup이고, 한 화면에 표시되지 않는 많은 데이터를 스크롤 되는 리스트로 표시한다
  • ViewHolder 패턴을 강제하여 대량의 데이터를 효율적으로 화면에 표시함
  • 보이는 항목만 View를 생성하고 새로운 아이템을 dirty view에 바인딩 하여 재사용함
  • layoutManager를 사용하여 수직, 수평, grid등 다양한 layout을 쉽게 설정 할 수 있음
  • ItemAnimator를 사용하여 지정할 수 있다 ItemDecorator를 이용하여 여백, 그림자 효과등도 적용할 수 있음

주의할 점

  1. 모든 아이템을 notify하는것은 되도록 피해라( notifyItemRangeChanged(0, getItemCount()); ->
    해결 방법 : notifyItemChanged(3)
  2. onBindViewHolder 안에 position을 사용하지 말라. (final인 position은 보장하지 않는다. 위치가 바뀌거나 지워질때 등)
    -> 해결방법 : holder.getAdapterPosition을 이용해라. -> getAbsoluteAdapterPosition을 사용하도록 권고
  3. holder.getAdapterPosition()해서 가져온 position값이 RecyclerView.NO_POSITION인지 꼭 확인하도록 해라.
    -> 방법. if(holder.getAdapterPosition()!=RecyclerView.NO_POSITION)인지 확인하고 필요한 로직 추가.
  4. Item Payload를 활용하라. -> 방법. adapter.notifyItemChanged(position, LIKE_UPDATE); (좋아요 눌렀을때 처리, 타입을 여러개로 나눠서 필요한 호출을 한다.) onBindViewHolder(holder, position, List payloads)를 override해서 사용하고 payloads.contains(LIKE_UPDATE) 함수로 좋아요를 눌렀는지 판단해서 로직 처리가 가능하다.
  5. onCreateViewHolder에서는 새로운 인스턴스만 반환해라. -> 전역변수로 holder를 keep했다가 캐시처럼 넘기는 오류는 범하지 말라. 항상 new Holder()를 반환하도록 해라.
  6. pool을 메모리 캐시에 놓고 모든 recyclerview에 세팅하지 말라. : context leak를 유발하게 될것.
  7. recyclerView adpater는 single쓰레드 기반이다. -> 영향을 주는 list들은 main Thread에서만 변경하도록 해야 정상 동작한다.
  •