목 차
1. ListView란 ?
2. RecyclerView란 ?
3. ListView와 RecyclerView의 차이점.
'안드로이드'에서 제공하는 뷰(View) 중 하나로,
리스트 형태의 데이터를 화면에 보여주는 역할을 수행합니다.
한 번에 모든 객체를 불러오기 때문에, 데이터가 많을 경우 앱 성능 이슈가 발생할 수 있습니다.
'안드로이드'에서 제공하는 뷰(View) 중 하나로, 리스트 형태의 데이터를 화면에 보여주는 역할을 합니다.
ListView 보다
'더 유연하게' 리스트 형태의 아이템을 구성 가능하며, 성능 개선을 위한 여러 기능을 제공합니다.
'ViewHolder' 패턴을 기반으로 한 아이템 재사용 방식을 사용해 성능 개선을 할 수 있습니다.
데이터가 많을 경우, 일부 아이템만 불러오기 때문에 성능 이슈를 줄일 수 있습니다.
ListView는 스크롤 시 아이템을 새로 생성하여, 메모리 성능에 부담이 됩니다.
RecyclerView는 ViewHolder 패턴을 통해 화면에 보이는 아이템만 유지하고 재활용하여 성능을 최적화합니다.
ListView .
: 스크롤할 때마다 배번 뷰-바인딩을 수행하여 성능이 저하됩니다.
RecyclerView.
: ViewHolder 패턴을 강제로 구현하여 뷰-바인딩을 한 번만 수행하고, 이후 바인딩 된 뷰 객체를 재활용합니다.
뷰 바인딩
뷰와 상호작용하는 코드를 쉽게 작성하기 위해 사용한다.
뷰 바인딩이 활성화되면 해당 모듈에있는 각 XML 레이아웃 파일에 대한 바인딩 클래스가 자동으로 생성된다. 바인딩 클래스 인스턴스에는 해당 레이아웃에 ID가 있는 모든 뷰에 대해 직접적으로 참조된다.
findViewById
액티비티에서 XML 레이아웃 파일의 값을 변경하기 위해 findViewById를 이용해 XML의 뷰와 변수를 연결시켜줄 수 있다.
안드로이드 3.5 버전까지는 findViewById를 이용했으나 여러 문제점으로 현재는 view Binding을 사용한다. 문제점은 아래와 같다.
1) Null 안정성:
현재 레이아웃에 존재하지 않는 View ID를 인자로 전달할 경우 Null Pointer Exception 오류가 발생한다.
2) Type 안정성: View를 잘못된 타입으로 캐스팅하면 Class Case Exception 오류가 발생할 수 있다. (*예시: TextView를 ImageView로 잘못 적을 경우)
3) 런타임 오류 : 레이아웃 파일과 코드가 일치하지 않은 경우 런타임 오류가 발생한다.
4) 속도 문제 : findViewById는 레이아웃 태그를 순회하여 일치하는 뷰를 찾아가기 때문에 연산 속도가 상대적으로 느려진다.
5) 코드 문제 : 바인딩 코드가 길어진다.
데이터 바인딩
레이아웃의 UI 구성요소를 앱의 데이터 소스와 결합할 수 있다.
inflate
XML 파일에 기술된 View의 정의를 실제 VIew 객체로 만드는 것(메모리에 올리는 것)을 말한다.
View를 보관하는 객체입니다.
ListView와 RecyclerView는 inflate를 최소화하고 findViewByid() 호출을 줄여서 View를 재활용하는데,
이 때 성능 저하를 방지하기 위해 ItemView의 각 요소를 바로 엑세스 할 수 있도록
저장해두고 사용하기 위해 사용합니다.
ListView .
: ViewHolder 패턴 사용이 선택사항입니다.
.
구현 방식
ViewHolder 패턴이 선택사항입니다
convertView가 null일 때만 새로운 ViewHolder를 생성합니다
setTag()와 getTag()를 통해 ViewHolder를 저장하고 재사용합니다
성능 이슈
findViewById() 호출이 빈번하게 발생할 수 있습니다
스크롤 시 뷰를 재활용하지만 효율성이 떨어집니다
RecyclerView.
: ViewHolder 패턴이 필수적으로 구현되어 있어서 성능이 더 우수합니다.
RecyclerView에서 ViewHolder 패턴 사용 시 필수로 구현해야 하는 메서드들:
onCreateViewHolder(): 새로운 ViewHolder가 필요할 때 호출됩니다.
onBindViewHolder(): ViewHolder와 데이터를 연결합니다.
getItemCount(): 데이터셋의 크기를 반환합니다.
장점.
ViewHolder 패턴이 기본적으로 내장되어 있습니다.
뷰의 재사용이 더 효율적으로 이루어집니다.
메모리 사용량이 최적화됩니다.
성능 최적화
메모리 관리
RecyclerView는 화면에 보이는 아이템만큼만 ViewHolder를 생성합니다
스크롤 시 기존 ViewHolder를 재활용하여 메모리 사용을 최적화합니다
데이터 바인딩
ListView는 getView() 메서드에서 데이터 바인딩을 처리합니다
RecyclerView는 onBindViewHolder() 메서드를 통해 더 체계적인 데이터 바인딩을 제공합니다
ListView
: 세로 방향 스크롤만 지원.
RecyclerView
: LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager를 통해
가로, 세로, 그리드 등 다양한 레이아웃을 지원합니다.
ListView
: 아이템 추가/제거 시 애니메이션 처리 클래스가 없습니다.
RecyclerView
: ItemAnimator 클래스를 통해 아이템 추가/제거 시 애니메이션을 쉽게 구현할 수 있습니다.
ListView
: AdapterView.OnItemClickListener 인터페이스를 통해 클릭 이벤트를 쉽게 처리할 수 있습니다.
RecyclerView
: 별도의 클릭 처리 인터페이스를 제공하지 않아 OnClickListener를 직접 구현해야 합니다.
ListView
: android:divider 속성으로 간단히 구분선을 설정할 수 있습니다.
RecyclerView
: ItemDecoration 클래스를 통해 더 다양한 구분선과 데코레이션을 구현할 수 있습니다