-
[Android] ViewHolderProgramming/Android 2020. 8. 14. 17:43
ViewHolder란
- View를 보관하는 객체이다.
- ListView와 RecyclerView는 inflate를 최소화하기 위해 View를 재활용 한다.
- 이 때, 각 뷰의 내용을 업데이트 하기 위해 findViewById를 매번 호출 해야한다.
- 이로 인해 성능저하가 일어남에 따라 ItemView의 각 요소를 바로 엑세스 할 수 있도록, 저장해두고 사용하기 위한 객체이다.
- 성능 향상을 위한 방법론이다.
- 각 아이템이 보여질 때마다 inflate되는 것을 최소화하여 성능을 높이기 위해 ViewHolder에 View를 저장하여 사용한다.
※ inflate? : xml 기술된 View의 정의를 실제 VIew 객체로 만드는 것(메모리에 올리는 것)을 말함.
ListView에서 ViewHolder
- getView()에서 넘어오는 파라미터인 convertView를 사용하지 않고 매번 새로운 View를 inflate하면 메모리가 낭비된다.
- 그래서 보통 convertView가 null일 때만 layout을 inflate하도록 구현한다.
- 이 때 항상 아이템 값을 set하기 위해서 findViewById()를 호출하게 되는데, XML 리소스에 접근하게 되고 이는 성능저하를 야기하는 원인이 된다.
- 이를 해결하기 위해 ListView에서도 ViewHolder를 사용할 수 있다.
- 즉, ListView에서 ViewHolder는 findViewById() 호출을 줄이기 위한 저장소 역할이다.
ListView ViewHolder 사용 구현 방법은 아래 블로그를 참조하면 된다.
- 핵심 아이디어는 convertView가 Null일 때는 layout inflate + View Binding + ViewHolder객체 생성 + convertView 태그설정.
- convertView가 Null이 아닐 때는 convertView의 태그 값을 통해 뷰홀더를 참조하여 뷰를 findViewById()호출 없이 재사용하는 것이다.
https://mainia.tistory.com/5524
안드로이드 개발 ViewHolder 패턴 이용해서 ListView 성능 향상하는 방법
안드로이드 개발 ViewHolder 패턴 이용해서 ListView 성능 향상하는 방법 환경: Android Studio ViewHolder 란 특정 클래스가 아닌 성능 향상을 위한 방법론입니다. Holder 패턴을 응용한 것인데 안드로이드에��
mainia.tistory.com
https://developside.tistory.com/88
ViewHolder 가 무엇인가요?
최근에 제가 안드로이드 면접을 봤었습니다. RecyclerView 이야기가 나와서 설명하다가 ViewHolder에 대해서 설명해 보라는 면접 질문을 받았었는데, 막상 아는 내용이지만 설명하려고 하니 어렵더군�
developside.tistory.com
RecyclerView의 ViewHolder
리스트뷰와 리사이클러뷰의 기본적인 동작 구조는 , 내 아이템 갯수만큼 1칸 1칸 지정한 형식의 xml View를 메모리에 인플레이트 시킵니다. 다만 이때 화면에 보이게 되는 아이템만을 인플레이트 시킵니다. 무슨 뜻이냐면, 실제로 내가 가진 ArrayList의 사이즈는 10이지만, 한 화면에 5개까지 밖에 표현할 수 없고, 나머지 5개는 다음 스크롤로 표현해야 한다면, 실제로 만들어지는 칸은 10개가 아닌, 5개만 만들어지게 됩니다.
그후, 스크롤이 되어 5번째 아이템과 6번째 아이템의 경계면이 화면에 보이는 순간! 6번째 아이템이
메모리에 인플레이트 되게 됩니다. 마찬가지로 스크롤 해서 6번째 아이템과 7번째 아이템의 경계면이 보이는 순간 7번째 아이템을 인플레이트 하게 됩니다.
이렇듯 기본적으로 “화면에 보이는 것만 로드하고 보이지 않는 것을 처음부터 모두 만들어두지는 않는다.” 라는
동작방식을 가지고 있습니다.
하지만 아이템이 100로 늘어났을땐 미리 만들지 않고, 보이는 순간에 만든다고 해도 100개의 칸을 모두 만들어야 하겠죠??(해당 각 칸의 TextView ,ImageView 등등 ) 여기서 바로 문제점이 발생합니다.
우리의 스마트폰은 한정된 메모리를 사용하고 있기 때문에 무한정 메모리에 뷰를 인플레이트 시킬 수 없습니다. 계속해서 뷰를 인플레이트 시키다 보면, 결국 Out of Memory를 만날 수 밖에 없는 것이죠.
어짜피 똑같은 형식(xml View)으로 , 값만 바꿔서 쓸건데 뭐하러 100칸을 다 만들지?? 그냥 화면에 5칸만 보인다면 한 한 6개쯤 만들어놓고 , 6번째칸이 보이면 1번째 칸이 안 보일테니까 새로 만드는 게 아니라 이미 만들어져있는 1번째 칸을 밑에다 붙여서 값만 바꿔주면 되는거 아냐??
하는 답을 얻게됩니다. 그렇기 위해 , xml View와 Data를 담아줄 수있는 Holder의 개념이 등장하게 됩니다. 이로써 ViewHolder를 재활용하는 개념이 적립이 되었다.
https://ppizil.tistory.com/entry/Recyclerview%EC%99%80-ViewHolder%EC%9D%98-%EA%B0%9C%EB%85%90/
Recyclerview와 ViewHolder의 개념
안녕하세요. 삐질삐질 개발하는 개발자 삐질입니다. 이번 글에서는 리사이클러뷰와 뷰홀더에 대해 알아보도록 하겠습니다. 이름에서 알수 있듯이 리사이클러뷰= 재활용 , 뷰홀더 = 그릇 이라�
ppizil.tistory.com
요약
- ViewHolder는 ListView/RecyclerView를 구현할 때 성능향상을 목적으로 View를 재사용하는 객체(방법)이다.
- infalte및 findViewById()호출을 줄이는 원리이다.
'Programming > Android' 카테고리의 다른 글
안드로이드 앱 개발 공부할 때 Rx라이브러리, 아키텍처, UI 디자인 필 수 일까 (0) 2020.09.12 [아키텍처] MVP Pattern의 이해 (0) 2020.09.01 안드로이드 빌드 도구, Gradle (0) 2020.08.12 [Android Style Guide] Util/Helper/Manager (0) 2020.06.03 FireBase / NoSQL / FireStore (0) 2020.05.28