안드로이드 리스트뷰(ListView) 동작방식 이해하기

개발/안드로이드 2017. 10. 13. 11:04
반응형

1. 안드로이드 Custom ListView를 만들어보자

2. 안드로이드 Custom Listview 이벤트 적용

3. 안드로이드 ListView 동작방식 이해하기


오늘은 ListView(리스트뷰) 동작에 관해 설명을 해보려고 합니다.


안드로이드에서 많은 양의 데이터를 보여주기 위해서 사용하는 위젯은 ListView 라고 할 수 있을 것입니다.

즉, 임베디드 기기에서는 제한적인 메모리 및 성능으로 인해 많은 양의 데이터를 표현하기 위해 ListView를 사용하게 됩니다.


ScrollView에서도 가능하지만 유동적인 반복데이터를 표현하기에는 오히려 복잡해 집니다. 

그리고 ScrollView에 붙은 모든 위젯을 미리 생성하기때문에 로딩속도도 느릴뿐만 아니라 메모리도 많이 먹게 됩니다.

요즘나오는 최신 기기에서는 메모리가 기가바이트 단위로 커져 문제는 없지만 백그라운드로 가게되면 자주 종료되어 불편하게 될 것입니다.


종합해보자면 ListView는 많은 데이터를 사용하더라도 로딩속도도 빠르면서 메모리도 절약 한다고 볼 수 있겠습니다.

그럼 ListView가 실제로 어떻게 동작하는지 살펴 보도록 하겠습니다.

ListView는 Adapter에서 각 아이템(행)마다 getView를 호출되어 동작하고 있습니다.

1000개의 데이터가 있으면 getView를 1000번을 바로 호출하지 않습니다. 

아래 이미지처럼 한 화면에 5개의 아이템이 표시가 된다면 5번만 호출 되게 됩니다.



빨간색 선은 실제 화면에 노출되는 화면영역입니다.

이처럼 1000개의 데이터를 표현하는데 5번의 호출만 하게되므로 속도 및 메모리가 절약 되는것입니다.



그럼 이번에는 아래로 스크롤을 하게되면 어떤 변화가 생기는지 확인 해보겠습니다.




아래로 스크롤을 하려고 할 때 ListView Adapter에서 getView를 한번 더 호출되어 '아이템 6'을 미리 생성하게 되는 것입니다. '아이템 6'을 생성 후 스크롤하여 보여주게 됩니다



여기서 한번 더 스크롤을 하게되면 예상한대로 '아이템 7'을 미리 생성하여 보여줍니다. 




여기서 중요한 부분이 지금까지는 getView가 호출될때 converView가 null 이였습니다. 

그래서 getView가 호출 될때마다 converView를 생성 해주었습니다.

 


※ 참고로 Adapter의 getView 원형입니다


1
public View getView(int position, View convertView, ViewGroup parent)
cs


 

이제 부터 총 7개의 아이템을 재활용하여 보여주게 됩니다. 즉, 화면에 표시할 아이템 5개와 미리생성 될 아이템 2개 입니다.

아래로 스크롤 하여 어떻게 재활용 되는지 확인해 보겠습니다.



스크롤을 하게되면 getView가 호출되면서 '아이템8'을 생성하여 보여줘야 하지만 convertView가 null 이 아닙니다. 

바로 '아이템1'이 위로 밀리면서 '아이템 8'자리에 오게 됩니다. convertView의 데이터를 변경하면 '아이템 1' => '아이템 8'로 둔갑하게 됩니다.

어차피 UI는 같기때문에 생성할 필요가 없는 것입니다.

아이템 7개가 전부 생성되었기 때문에 이제부터는 스크롤 하게 되면 아이템은 생성되지 않고 계속 재활용되는 형태로 동작하게 됩니다.

'아이템 100'을 보여주든.. '아이템 1000'을 보여주든...


그러면 아이템을 생성할 필요도 없으니 메모리나 성능면에서도 최고의 효과를 보게되는 것입니다.


어떤가요? 이해 되셨나요? 쉽게 설명하려고 했지만 글로 전달하니 상당히 어렵네요.





반응형
admin