SlideShare a Scribd company logo
1 of 5
Download to read offline
리스트뷰는 앱개발에 있어서, 빈번하게 사용이 되는 항목입니다. 이 부분에 있어서 속도 향상 가

이드에 대해서 공유를 드립니다.


결론

1. Adapter에 있는 getView에서 항목을 그리는 inflate를 convertView를 재활용하자.


2. ViewHolder 패턴을 사용하자.


위 2가지를 사용했을 때 속도는 아래와 같이 처리 안 했을 때와 속도 차가 마니~ 납니다.




표로 봐서 그렇지, 실제로 한 번 스클롤 던져보면 느낌 더 받을 수 있습니다.이제부터는 위 항목
에 대해서 알게 된 사실들을 좀 더 자세히 이야기 드립니다.


상세 설명

1. Adapter에 있는 getView에서 항목을 그리는 inflate를 convertView를 재활용하자.

ListView는 화면을 그리는 친구가 있습니다. 이 친구는 좀 더 효율적으로 그리기 위해서 나름 화

면에 10개가 표시가 되면, 전체 목록이 1000개라고 하면 다 안 그리고 화면에 뿌려질 아이들만

가져다가 그려 줍니다.

이를 위해서 Adapter들은 아래와 같은 함수들을 필수적으로 가지게 됩니다.


      getCount()
   getItem(int position)

        getItemId(int position)


        getView(int position, View convertView, ViewGroup parent)

즉 View는 Adapter한테 이번에는 화면에 몇번째가 보일 때니깐 해당 위치와 함께 거기다가 그려

줄 아이를 달라고 합니다. 그러면 어댑터는 getView에서 열심히 일해서 전달을 해줍니다. 여기서
getView는 정말 열심히 일을 하는데, 이게 비쌉니다. 즉 성능에 영향을 많이 미치게 되는 것입니

다.


그래서 여기를 잘 만드는게, 바로 리스트뷰를 빠르게 보여주는데 결정적 역할을 합니다.

이를 위해서, 기반을 만들어 준 것이 바로 getView의 두 번째 인자는 convertView 입니다. 이 항
목은 안드로이드 안에서 재활용을 할 수 있도록 앞서 화면을 채우기 위해서 만들고 반환이 된 항

목에 대한 View 입니다.

그렇다 함은 View가 앞서 사용이 되었었기에 기존에 설정되어 있던 값들이 모조리 설정이 되어
있겠군요. 만약 반환되어 재활용할 수 있는 View에 데이터가 “test”라고 설정이 되어 있으면, 수정
을 하지 않는 이상 그대로 적혀서 나오게 됩니다. 그러니깐 재활용을 할려면, 받은 convertView를

원하는 모양으로 꾸며야 할 것입니다. 물론 재활용 할 것이 없는 경우에는 Null이 넘어오니깐 이

런 부분에서는 비싸더라도 inflate를 해서 View를 만드는 것은 필수이구요.

정리하면, 10개 목록이 있는데, 이게 스크롤이 되어서 12번째 항목이 화면에 보여지게 될 때에는
앞서 화면에 사라진 1번째 항목이 convertView로 전달이 되는 거구, 우리는 여기다가 데이터를
설정해서 다시 활용해서 비싼 inflate를 하지 않는 것이지요. 여기서 12번째인 이유는 화면 상에서
사라지더라도 일정 기간은 안 보이는 항목도 준비한다고 합니다. 물론 이 준비 여부 로직은 안드

러이드 OS 수준에서 일어나니깐 업그레이드 되면 바뀌겠죠.


이를 코드로 보면 아래와 같습니다.
위 코드야 개념만 간단히 보여주는 거라서, 컴파일은 안 될 수도 있습니다. 이렇게 해서 화면에서

없어지는 View를 재활용하는 것이 바로 속도 향상 기본인 것이죠.

근데 왠지 위 코드를 보면 우리가 사용하는 복잡 다단한 이른바 목록에 여러 형태 Row가 나오는
경우에는 안 될 것 같지 않은가? convertView가 내가 사용한 형태에 따른 Row가 올지 모르니깐
이거 못 쓰는 것 아닌가 생각이 들 수 있습니다. 심지어 인터넷에는 그렇다고 주장하는 사람들도

있습니다.

여기서 우리는 좀 더 생각하면, 이런 생각을 가질 수 있습니다. 만약 시스템에서 Row들이 각기

다른 유형 Row들이 있고, 이번에 화면에 표시될 Row가 어떤 유형인지를 미리 알 수만 있다면 시
스템이 알아서 해당 유형에 맞는 convertView를 준다고 하면 되는 것이 아닌가?라는 의문을 가질

수 있습니다.

이렇게 해 주고 있습니다. 아래 그림과 같이.




재활용 공간을 만들고, 유형별로 저장했다가 재활용을 할 수 있게 구조가 되어 있다고 합니다. 그
렇기에   우리는      동일한      형태로     recycler(convertView를   재활용하도록   도와주는   친구)에서

convertView를 받아다가 유형별로 inflate 또는 재활용을 하면 됩니다.

그러나, 아까 전제로 이야기 한 것이 있습니다. 바로 어떤 Row가 어떤 유형이고, 이번에는 어떤
유형인지는 알아야 Recycler가 잘 동작을 할 수 있습니다. 이것을 해주는 곳은 지금까지 알아본
바와 같이 ListView가 화면을 그릴 때 도움을 받는 바로 Adapter입니다. 이 Adapter에 아래와 같

은 함수를 추가로 넣어주어 Row 유형에 대해서 알려주면 됩니다.


     Override int getViewTypeCount()
    Override int getItemViewType(int)

위 2가지 함수를 통해서 특정 Row에 포함된 유형에 대해서 알려주면, 이제 우리가 하는 마지막

작업은 유형에 맞게 inflate를 하거나 데이터를 설정하는 작업입니다.




이렇게 함으로 인해서, 각기 다른 row 유형이 있는 ListView에 대해서도 적절히 recycler를 활용해

서 속도 향상을 가져오게 되었습니다.

2. ViewHolder 패턴을 사용하자.

잠시        보기는   했지만,     앞서     우리는      특정   View에   대해서   tag를   설정하는   부분에   있어서

findResourceById와 같은 함수를 통해서 Resource에 접근을 하고 그 항목에 값을 설정했습니다.

그런데 이렇게 하는 것이 안드로이드에서는 비용이 많이 드는 작업입니다. 특히나 View의 구조가

복잡할수록 더욱 힘들어지는 것이죠. 이러한 작업을 대신하는 것이 바로 ViewHolder 패턴입니다.

ViewHolder라고 하는 것이 데이터 설정된 곳을 미리 표시해서 findViewById와 같은 작업을 하지

않고 데이터를 설정하는 방식입니다. 이를 위한 방법을 간단히 설명하면 다음과 같습니다.

     1.   설정할 데이터 설정된 View들을 나타내는 구조체를 만듭니다.

          참고로, 조금이나마 빠르게 멤버 접근자를 public으로 만듭니다.

     2.   inflate하는 시점에 구조체 항목에 inflate된 View와 연결을 한 뒤에 setTag를 통해서 새로

          설정한 ViewHolder가 연결되어 있음을 선언합니다.

     3.   데이터를 넣을 때에는 재활용되는 convertView에서 getTag를 통해서 해당 View에 연결된
ViewHolder를 가져와서 값을 설정합니다.

글로 쓰니깐 보기가 어렵습니다. 그래서 바로 코드로 봅니다. 각 숫자에 있는 코드가 앞서 설명한

부분에 대한 코드입니다.




    1.




    2.

    3.

위와 같이 convertView와 ViewHolder 패턴을 혼용해주게 되면, findViewById 라는 비싼 활동을

최소화하여 전체적으로 속도 향상에 많은 도움이 됩니다.


참고자료

http://android.amberfog.com/?p=296

http://www.google.com/intl/ko/events/io/2009/sessions/TurboChargeUiAndroidFast.html

http://xjaphx.wordpress.com/2011/06/16/viewholder-pattern-caching-view-efficiently/

http://stackoverflow.com/questions/5300962/getviewtypecount-and-getitemviewtype-methods-of-

arrayadapter

More Related Content

Similar to 안드로이드 리스트뷰 속도향상

Viewpager를활용한app만들기
Viewpager를활용한app만들기Viewpager를활용한app만들기
Viewpager를활용한app만들기DaeHee Jang
 
Vue guide v0.1
Vue guide v0.1Vue guide v0.1
Vue guide v0.1DataUs
 
복잡한 RecyclerView, 군더더기 없이 데이터로 표현하기
복잡한 RecyclerView, 군더더기 없이 데이터로 표현하기복잡한 RecyclerView, 군더더기 없이 데이터로 표현하기
복잡한 RecyclerView, 군더더기 없이 데이터로 표현하기Lake Kim
 
iOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4UiOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4Usys4u
 
Java, android 스터티7
Java, android 스터티7Java, android 스터티7
Java, android 스터티7Heejun Kim
 
막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)연웅 조
 
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본Lee Sang-Ho
 
[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기YoungSu Son
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃Kwangyoun Jung
 
08 fragment 태블릿 대응
08 fragment   태블릿 대응08 fragment   태블릿 대응
08 fragment 태블릿 대응운용 최
 
17 adapter view & db
17 adapter view & db17 adapter view & db
17 adapter view & db운용 최
 
RAD Studio 라이브바인딩 이해하기
RAD Studio 라이브바인딩 이해하기RAD Studio 라이브바인딩 이해하기
RAD Studio 라이브바인딩 이해하기Devgear
 
Angular js 의존관계 주입과 서비스
Angular js 의존관계 주입과 서비스Angular js 의존관계 주입과 서비스
Angular js 의존관계 주입과 서비스Tae Ho Kang
 
Ksh portfolio
Ksh portfolioKsh portfolio
Ksh portfolioSunhoKo2
 
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220Seomgi Han
 
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기NAVER Engineering
 
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.ssuser6dd171
 

Similar to 안드로이드 리스트뷰 속도향상 (20)

Viewpager를활용한app만들기
Viewpager를활용한app만들기Viewpager를활용한app만들기
Viewpager를활용한app만들기
 
Light Tutorial Django
Light Tutorial DjangoLight Tutorial Django
Light Tutorial Django
 
Vue guide v0.1
Vue guide v0.1Vue guide v0.1
Vue guide v0.1
 
복잡한 RecyclerView, 군더더기 없이 데이터로 표현하기
복잡한 RecyclerView, 군더더기 없이 데이터로 표현하기복잡한 RecyclerView, 군더더기 없이 데이터로 표현하기
복잡한 RecyclerView, 군더더기 없이 데이터로 표현하기
 
iOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4UiOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4U
 
Java, android 스터티7
Java, android 스터티7Java, android 스터티7
Java, android 스터티7
 
막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)
 
8장 editor
8장 editor8장 editor
8장 editor
 
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
[방송통신대 컴퓨터과학과] 2020년 1학기 전공 모바일 앱 프로그래밍 기말평가 제출본
 
[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
 
08 fragment 태블릿 대응
08 fragment   태블릿 대응08 fragment   태블릿 대응
08 fragment 태블릿 대응
 
17 adapter view & db
17 adapter view & db17 adapter view & db
17 adapter view & db
 
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
 
RAD Studio 라이브바인딩 이해하기
RAD Studio 라이브바인딩 이해하기RAD Studio 라이브바인딩 이해하기
RAD Studio 라이브바인딩 이해하기
 
Angular js 의존관계 주입과 서비스
Angular js 의존관계 주입과 서비스Angular js 의존관계 주입과 서비스
Angular js 의존관계 주입과 서비스
 
Ksh portfolio
Ksh portfolioKsh portfolio
Ksh portfolio
 
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
피플펀드 웹서비스 성능개선기(+초기 스타트업의 개발방법론) 20171220
 
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
 
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
유니티 REST API를 사용한 파이어 베이스의 데이터 베이스 사용.
 

More from 운용 최

Wot(daliworks) 20131113
Wot(daliworks) 20131113Wot(daliworks) 20131113
Wot(daliworks) 20131113운용 최
 
NIPA SW Insight Report '13.08
NIPA SW Insight Report '13.08NIPA SW Insight Report '13.08
NIPA SW Insight Report '13.08운용 최
 
Agile Spirit Base On The Book "Agile Samuari"
Agile Spirit Base On The Book "Agile Samuari"Agile Spirit Base On The Book "Agile Samuari"
Agile Spirit Base On The Book "Agile Samuari"운용 최
 
21 application and_network_status
21 application and_network_status21 application and_network_status
21 application and_network_status운용 최
 
20 handler and_async_task
20 handler and_async_task20 handler and_async_task
20 handler and_async_task운용 최
 
19 나만의 view 만들기
19 나만의 view 만들기19 나만의 view 만들기
19 나만의 view 만들기운용 최
 
16 데이터 저장과 사용
16 데이터 저장과 사용16 데이터 저장과 사용
16 데이터 저장과 사용운용 최
 
15 content provider
15 content provider15 content provider
15 content provider운용 최
 
14 broad castreceiver
14 broad castreceiver14 broad castreceiver
14 broad castreceiver운용 최
 
13 service 좀더
13 service 좀더13 service 좀더
13 service 좀더운용 최
 
11 tablet 대응 가이드
11 tablet 대응 가이드11 tablet 대응 가이드
11 tablet 대응 가이드운용 최
 
10 view orientation_change
10 view orientation_change10 view orientation_change
10 view orientation_change운용 최
 
09 android keyboard & layout
09 android keyboard & layout09 android keyboard & layout
09 android keyboard & layout운용 최
 
07 다양한 device_대응_방법
07 다양한 device_대응_방법07 다양한 device_대응_방법
07 다양한 device_대응_방법운용 최
 
06 activity stack and back, flag
06 activity stack and back, flag06 activity stack and back, flag
06 activity stack and back, flag운용 최
 
05 pending intent
05 pending intent05 pending intent
05 pending intent운용 최
 

More from 운용 최 (20)

Wot(daliworks) 20131113
Wot(daliworks) 20131113Wot(daliworks) 20131113
Wot(daliworks) 20131113
 
NIPA SW Insight Report '13.08
NIPA SW Insight Report '13.08NIPA SW Insight Report '13.08
NIPA SW Insight Report '13.08
 
Agile Spirit Base On The Book "Agile Samuari"
Agile Spirit Base On The Book "Agile Samuari"Agile Spirit Base On The Book "Agile Samuari"
Agile Spirit Base On The Book "Agile Samuari"
 
Uml intro 1
Uml intro 1Uml intro 1
Uml intro 1
 
Uml intro 0
Uml intro 0Uml intro 0
Uml intro 0
 
21 application and_network_status
21 application and_network_status21 application and_network_status
21 application and_network_status
 
20 handler and_async_task
20 handler and_async_task20 handler and_async_task
20 handler and_async_task
 
19 나만의 view 만들기
19 나만의 view 만들기19 나만의 view 만들기
19 나만의 view 만들기
 
16 데이터 저장과 사용
16 데이터 저장과 사용16 데이터 저장과 사용
16 데이터 저장과 사용
 
15 content provider
15 content provider15 content provider
15 content provider
 
14 broad castreceiver
14 broad castreceiver14 broad castreceiver
14 broad castreceiver
 
13 service 좀더
13 service 좀더13 service 좀더
13 service 좀더
 
12 service
12 service12 service
12 service
 
11 tablet 대응 가이드
11 tablet 대응 가이드11 tablet 대응 가이드
11 tablet 대응 가이드
 
10 view orientation_change
10 view orientation_change10 view orientation_change
10 view orientation_change
 
09 android keyboard & layout
09 android keyboard & layout09 android keyboard & layout
09 android keyboard & layout
 
08 font size
08 font size08 font size
08 font size
 
07 다양한 device_대응_방법
07 다양한 device_대응_방법07 다양한 device_대응_방법
07 다양한 device_대응_방법
 
06 activity stack and back, flag
06 activity stack and back, flag06 activity stack and back, flag
06 activity stack and back, flag
 
05 pending intent
05 pending intent05 pending intent
05 pending intent
 

안드로이드 리스트뷰 속도향상

  • 1. 리스트뷰는 앱개발에 있어서, 빈번하게 사용이 되는 항목입니다. 이 부분에 있어서 속도 향상 가 이드에 대해서 공유를 드립니다. 결론 1. Adapter에 있는 getView에서 항목을 그리는 inflate를 convertView를 재활용하자. 2. ViewHolder 패턴을 사용하자. 위 2가지를 사용했을 때 속도는 아래와 같이 처리 안 했을 때와 속도 차가 마니~ 납니다. 표로 봐서 그렇지, 실제로 한 번 스클롤 던져보면 느낌 더 받을 수 있습니다.이제부터는 위 항목 에 대해서 알게 된 사실들을 좀 더 자세히 이야기 드립니다. 상세 설명 1. Adapter에 있는 getView에서 항목을 그리는 inflate를 convertView를 재활용하자. ListView는 화면을 그리는 친구가 있습니다. 이 친구는 좀 더 효율적으로 그리기 위해서 나름 화 면에 10개가 표시가 되면, 전체 목록이 1000개라고 하면 다 안 그리고 화면에 뿌려질 아이들만 가져다가 그려 줍니다. 이를 위해서 Adapter들은 아래와 같은 함수들을 필수적으로 가지게 됩니다.  getCount()
  • 2. getItem(int position)  getItemId(int position)  getView(int position, View convertView, ViewGroup parent) 즉 View는 Adapter한테 이번에는 화면에 몇번째가 보일 때니깐 해당 위치와 함께 거기다가 그려 줄 아이를 달라고 합니다. 그러면 어댑터는 getView에서 열심히 일해서 전달을 해줍니다. 여기서 getView는 정말 열심히 일을 하는데, 이게 비쌉니다. 즉 성능에 영향을 많이 미치게 되는 것입니 다. 그래서 여기를 잘 만드는게, 바로 리스트뷰를 빠르게 보여주는데 결정적 역할을 합니다. 이를 위해서, 기반을 만들어 준 것이 바로 getView의 두 번째 인자는 convertView 입니다. 이 항 목은 안드로이드 안에서 재활용을 할 수 있도록 앞서 화면을 채우기 위해서 만들고 반환이 된 항 목에 대한 View 입니다. 그렇다 함은 View가 앞서 사용이 되었었기에 기존에 설정되어 있던 값들이 모조리 설정이 되어 있겠군요. 만약 반환되어 재활용할 수 있는 View에 데이터가 “test”라고 설정이 되어 있으면, 수정 을 하지 않는 이상 그대로 적혀서 나오게 됩니다. 그러니깐 재활용을 할려면, 받은 convertView를 원하는 모양으로 꾸며야 할 것입니다. 물론 재활용 할 것이 없는 경우에는 Null이 넘어오니깐 이 런 부분에서는 비싸더라도 inflate를 해서 View를 만드는 것은 필수이구요. 정리하면, 10개 목록이 있는데, 이게 스크롤이 되어서 12번째 항목이 화면에 보여지게 될 때에는 앞서 화면에 사라진 1번째 항목이 convertView로 전달이 되는 거구, 우리는 여기다가 데이터를 설정해서 다시 활용해서 비싼 inflate를 하지 않는 것이지요. 여기서 12번째인 이유는 화면 상에서 사라지더라도 일정 기간은 안 보이는 항목도 준비한다고 합니다. 물론 이 준비 여부 로직은 안드 러이드 OS 수준에서 일어나니깐 업그레이드 되면 바뀌겠죠. 이를 코드로 보면 아래와 같습니다.
  • 3. 위 코드야 개념만 간단히 보여주는 거라서, 컴파일은 안 될 수도 있습니다. 이렇게 해서 화면에서 없어지는 View를 재활용하는 것이 바로 속도 향상 기본인 것이죠. 근데 왠지 위 코드를 보면 우리가 사용하는 복잡 다단한 이른바 목록에 여러 형태 Row가 나오는 경우에는 안 될 것 같지 않은가? convertView가 내가 사용한 형태에 따른 Row가 올지 모르니깐 이거 못 쓰는 것 아닌가 생각이 들 수 있습니다. 심지어 인터넷에는 그렇다고 주장하는 사람들도 있습니다. 여기서 우리는 좀 더 생각하면, 이런 생각을 가질 수 있습니다. 만약 시스템에서 Row들이 각기 다른 유형 Row들이 있고, 이번에 화면에 표시될 Row가 어떤 유형인지를 미리 알 수만 있다면 시 스템이 알아서 해당 유형에 맞는 convertView를 준다고 하면 되는 것이 아닌가?라는 의문을 가질 수 있습니다. 이렇게 해 주고 있습니다. 아래 그림과 같이. 재활용 공간을 만들고, 유형별로 저장했다가 재활용을 할 수 있게 구조가 되어 있다고 합니다. 그 렇기에 우리는 동일한 형태로 recycler(convertView를 재활용하도록 도와주는 친구)에서 convertView를 받아다가 유형별로 inflate 또는 재활용을 하면 됩니다. 그러나, 아까 전제로 이야기 한 것이 있습니다. 바로 어떤 Row가 어떤 유형이고, 이번에는 어떤 유형인지는 알아야 Recycler가 잘 동작을 할 수 있습니다. 이것을 해주는 곳은 지금까지 알아본 바와 같이 ListView가 화면을 그릴 때 도움을 받는 바로 Adapter입니다. 이 Adapter에 아래와 같 은 함수를 추가로 넣어주어 Row 유형에 대해서 알려주면 됩니다.  Override int getViewTypeCount()
  • 4. Override int getItemViewType(int) 위 2가지 함수를 통해서 특정 Row에 포함된 유형에 대해서 알려주면, 이제 우리가 하는 마지막 작업은 유형에 맞게 inflate를 하거나 데이터를 설정하는 작업입니다. 이렇게 함으로 인해서, 각기 다른 row 유형이 있는 ListView에 대해서도 적절히 recycler를 활용해 서 속도 향상을 가져오게 되었습니다. 2. ViewHolder 패턴을 사용하자. 잠시 보기는 했지만, 앞서 우리는 특정 View에 대해서 tag를 설정하는 부분에 있어서 findResourceById와 같은 함수를 통해서 Resource에 접근을 하고 그 항목에 값을 설정했습니다. 그런데 이렇게 하는 것이 안드로이드에서는 비용이 많이 드는 작업입니다. 특히나 View의 구조가 복잡할수록 더욱 힘들어지는 것이죠. 이러한 작업을 대신하는 것이 바로 ViewHolder 패턴입니다. ViewHolder라고 하는 것이 데이터 설정된 곳을 미리 표시해서 findViewById와 같은 작업을 하지 않고 데이터를 설정하는 방식입니다. 이를 위한 방법을 간단히 설명하면 다음과 같습니다. 1. 설정할 데이터 설정된 View들을 나타내는 구조체를 만듭니다. 참고로, 조금이나마 빠르게 멤버 접근자를 public으로 만듭니다. 2. inflate하는 시점에 구조체 항목에 inflate된 View와 연결을 한 뒤에 setTag를 통해서 새로 설정한 ViewHolder가 연결되어 있음을 선언합니다. 3. 데이터를 넣을 때에는 재활용되는 convertView에서 getTag를 통해서 해당 View에 연결된
  • 5. ViewHolder를 가져와서 값을 설정합니다. 글로 쓰니깐 보기가 어렵습니다. 그래서 바로 코드로 봅니다. 각 숫자에 있는 코드가 앞서 설명한 부분에 대한 코드입니다. 1. 2. 3. 위와 같이 convertView와 ViewHolder 패턴을 혼용해주게 되면, findViewById 라는 비싼 활동을 최소화하여 전체적으로 속도 향상에 많은 도움이 됩니다. 참고자료 http://android.amberfog.com/?p=296 http://www.google.com/intl/ko/events/io/2009/sessions/TurboChargeUiAndroidFast.html http://xjaphx.wordpress.com/2011/06/16/viewholder-pattern-caching-view-efficiently/ http://stackoverflow.com/questions/5300962/getviewtypecount-and-getitemviewtype-methods-of- arrayadapter