ListView와 RecyclerView의 차이: View Binding, View Holder 등

JIYOON·2021년 7월 25일
2

Android

목록 보기
8/9
post-thumbnail

📣 목표
안드로이드의 ListView와 RecyclerView의 차이에 대해서 알아보자!


1️⃣ View Binding

01. ListView

최초 생성이나 스크롤 시 아이템을 생성할 때마다 뷰바인딩을 해서 성능 저하가 일어난다.

02. 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 객체로 만드는 것(메모리에 올리는 것)을 말한다.




2️⃣ View Holder

View를 보관하는 객체이다.
ListView와 RecyclerView는 inflate를 최소화하기 위해 View를 재활용하는데, 이 때 성능 저하를 방지하기 위해 ItemView의 각 요소를 바로 엑세스 할 수 있도록 저장해두고 사용하기 위해 사용한다.

01. ListView

ListView는 아이템의 전체 개수가 아닌 화면에 보여지는 개수 만큼만 View를 그려놓은 뒤 그것을 재활용하는 구조로 설계되어 있다.
예시로 배열이 10개이고 화면에 보여지는 View가 5개면 Adapter에 10개의 Object들이 Setting된 후 모든 Object들의 10개의 View를 생성하여 보여주는 것이 아니라 5개의 Object만 보여준다. ListView 스크롤이 내려가게되면 첫 번째 View는 사라지고 6번째의 View가 보여진다. 이 때 6번째의 View는 새로 생성되는 것이 아니라 기존의 View를 재사용하여 값만 새로이 Setting하는 개념이다.

실제 화면에 그려지는 아이템을 ConvertView 라는 배열로 관리하는데, 화면에 보여지는 만큼 Convert View를 생성하고 스크롤시 View를 재활용하기 때문에 성능면으로 우수한 구조이다.ListView의 재활용 View인 Convertview는 Adapter의 getView( )를 통해서 관리되고, ListView는 화면에 새로운 아이템을 표시할 때마다 Adapter의 getView( )를 호출하게 된다.

ConvertView가 null이 아닌 경우에는 기존의 View 를 재사용하기 때문에 새롭게 View를 inflate 할 필요 없이 데이터만 바꾸는 작업을 진행하면 된다. 따라서 메모리가 낭비되지 않을 수 있다.

convertView가 null일 때는 layout을 inflate하도록 구현되는데, 이 때 아이템 값을 set하기 위해서 findViewById()를 호출한다. findViewById()는 XML 리소스에 접근하며 성능저하를 야기하는 원인이 된다.
ListView에서 ViewHolder는 이러한 findViewById() 호출을 줄이기 위한 저장소 역할을 한다.

02. RecyclerView

RecyclerView에서는 ViewHolder 패턴을 강제로 구현한다.




3️⃣ Item Layout

01. ListView

세로 방향만 지원한다.

02. RecyclerView

ListView와 GridView의 기능을 제공하여, 가로, 세로, 사선 방향 모두 지원한다.




4️⃣ Item Animation

01. ListView

아이템이 추가 및 제거될 때 사용할 수 있는 애니메이션이 없다.

02. RecyclerView

아이템이 추가 및 제거될 때 사용할 수 있는 애니메이션을 처리하는 클래스가 있다.




4️⃣ Item Decoration

01. ListView

Android:divider 속성을 활용하여 리스트에 있는 아이템들을 구분한다.

02. RecyclerView

RecyclerView.ItemDecoration 객체를 활용하여 Listview 보다 많은 구분선을 활용할 수 있다.




4️⃣ Click Detection

01. ListView

개별 항목에 클릭 이벤트를 바인딩하기 위한 AdapterView.OnItemClickListener 인터페이스가 있다.

02. RecyclerView

개별 터치 이벤트를 관리하나 클릭 처리 기능이 내장되어 있지 않다.




✅ Reference

RecyclerView의 특징과 ListView와의 차이점 by 끄적이는 개발노트
안드로이드 데이터 바인딩 in Java by 엥휴
안드로이드 뷰 바인딩(view binding) by 오늘의코드
[안드로이드] 리스트뷰 성능최적화 (Convertview와 ViewHolder Pattern의 이해) by IT 마이닝
[안드로이드] 리스트뷰의 개념 및 사용법 by IT 마이닝
Recyclerview와 ViewHolder의 개념 by 삐질
Using lists and grids in Android with RecyclerView - Tutorial by Lars Vogel

4개의 댓글

comment-user-thumbnail
2024년 3월 26일

친절한 설명 감사합니다!

답글 달기
comment-user-thumbnail
2024년 3월 26일

친절한 설명 감사합니다!

답글 달기
comment-user-thumbnail
2024년 3월 26일

친절한 설명 감사합니다!

답글 달기
comment-user-thumbnail
2024년 3월 26일

친절한 설명 감사합니다!

답글 달기