일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Java8
- git
- ReactiveProgramming
- Jetpack
- Java
- library
- programmers
- livedata
- sourcetree
- Room
- rxjava
- IntelliJ
- androidstudio
- Algorithm
- Version
- Android
- FRAGMENT
- Database
- leetcode
- homebrew
- Kotlin
- ViewModel
- github
- Today
- Total
Learn & Run
Android - ListView에서의 getView() 메서드, ConvertView와 ViewHolder Pattern를 통해 성능 개선하기 본문
Android - ListView에서의 getView() 메서드, ConvertView와 ViewHolder Pattern를 통해 성능 개선하기
iron9462 2021. 6. 21. 21:10Android 공부를 시작하다보면 여러개의 아이템을 보여줄 수 있는 ListView를 접하게 된다. 좀 더 진도를 나아가보면 훨씬 더 중요하고 자주 쓰이는 RecyclerView를 접하게 되지만, 이번 포스팅에서는 ListView에 초점을 두어 작성해보려고 한다. 이전 포스팅에서 BaseAdapter를 상속한 Adapter의 getView() 메서드에서 인플레이션 과정이 일어나는 것을 설명했다. 다시 한 번 알아보도록 하고, 이것을 개선시킬 수 있는 방법인 ConvertView와 ViewHolder pattern에 대해서도 알아보도록 하자.
1. BaseAdapter의 getView() 메서드 다시 확인하기
2. ConvertView란 무엇인가
우선 converView를 알아보기전에 ListView에 먼저 알아보아야 한다. 리스트뷰는 다른 일반 View들과 다르게 성능을 위해 설계된 View이다. 위의 getView() 메서드를 다시 생각해보자. 다음에 보여질 새로운 아이템의 데이터를 보여주려면 인플레이션 과정이 계속해서 새롭게 일어나야한다. 굳이 이럴 필요가 있을까? 각 아이템은 내용만 다를뿐 레이아웃은 동일한 아이템이기 때문에 재사용할 수 있으면 얼마나 좋을 것인가? 또한 모든 아이템에 인플레이션 과정이 일어난다면 성능상으로도 좋지 않을 것 이라고 생각해볼 수 있을 것이다. 아무튼 이 문제를 해결하기 위해 설계한 View가 ListView이다. 이 문제를 해결하기 위해 ListView 는 아이템의 전체 개수가 아닌 화면에 보여지는 개수 만큼만 View를 그려놓은 뒤 그것을 재활용하는 구조로 설계 되었다. 예를 들어 아이템의 개수가 50개라 가정하고 실제로 화면에 보여지는 아이템이 5개라고 한다면 모든 아이템들의 View를 생성하여 보여주는 것이 아니라 화면에 보이는 5개의 아이템만 보여준다. 여기서 ListView 스크롤이 내려가게되면 첫 번째 View는 사라지고 6번째의 View가 보여진다. 이 때 6번째의 View는 새로 생성되는 것이 아니라 기존에 만들어진 View를 재사용하게 되는데 그것이 바로 convertView인 것이다. 아래 그림을 확인해보도록 하자.
3. ViewHolder는 무엇인가
위의 2번 글만 읽어봐도 이미 개선할 것이 모두 끝난 것처럼 보인다. 충분히 인플레이션 과정을 줄이게 되었기 때문이다. 하지만, 조금이라도 좋은 성능을 만들 수 있다면 고려해봐야 하는 법이다. convertView를 사용하며 추가적으로 더 개선시킬 수 있는 코드가 있는 데 (실제 Google I/O에서 권장됨) 개별 View가 존재하는 경우 View의 setTag(), getTag() 메서드를 이용하여 findViewById() 메서드의 빈도수까지 줄일 수 있는 ViewHolder Pattern 방법이다. ListView에서 아이템이 보여질 때마다 getView( ) 메서드가 호출되게 되는데, 여기서 해당되는 데이터를 View에 표시하기위해 findViewById( )를 통해 해당되는 View를 얻어온 후 데이터를 표시하는 것이 일반적이다. 하지만 아이템 View 구조가 복잡할 경우 매번 findViewById( )를 호출하는 것은 매우 값비싼 작업이기 때문에 매끄러운 스크롤을 방해할 가능성이 있다. 실제로 ViewGroup마다 성능 퍼포먼스 차이가 있는 것도 알아두면 좋다. 아무튼 아래 이미지를 통해서 ViewHolder pattern에 대해 감각을 익혀보도록 하자. convertView가 없을 경우에만 View를 생성하고 각각의 데이터들을 findViewById() 메서드를 이용해 찾아준 후에 ViewHolder 멤버 변수에 참조시켜주도록 한다. 그러면 convertView가 재사용 될 때에는 findViewById() 메서드를 부를 필요가 없어지게 되어 성능 퍼포먼스를 증가시킬 수 있다. (여기서 성능 퍼포먼스란 복잡한 레이아웃 구조에 findViewById() 메서드를 많이 사용할 때를 말함)
- convertView만 사용할 때
- convertView + ViewHolder pattern 사용할 때
'Android' 카테고리의 다른 글
Jetpack - Room (2) (0) | 2021.07.15 |
---|---|
Jetpack - Room (1) (0) | 2021.07.14 |
Android - ViewHolder Class는 Static과 Non-static 중에 무엇으로 정의하는 것이 좋을까? (0) | 2021.06.23 |
Android - 인플레이션(Inflation) 이해하기 (2) (0) | 2021.06.10 |
Android - 인플레이션(Inflation) 이해하기 (1) (1) | 2021.06.09 |