본문 바로가기
Kotlin

[Kotlin/코틀린] Android ArrayAdapter getView 안의 ConvertView 가 뭘까?

by IGBR 2022. 3. 15.

서론 (왜?)

ListView를 처음 사용한다고 했을 때 가장 어색하고 예시코드를 안보고 코딩을 하는데 가장 어려움을 느꼈던 부분이 바로 Adpater 였다. 

 ListView 사용시 클래스 파일로 ArrayAdpater를 상속하고 getView() 메소드를 재정의 하여 사용하게 되는데 이 getView()의 파라미터로 있는 convertView가 뭔지 또 ListView에서 어떤 역할인지 궁금하여 포스팅을 하려고 한다.

 


본론

Q : ListView는 왜 나왔을까?

A : 많은 데이터를 스크롤이 가능하게 표현해주려고?

: ScrollView 사용하면 되는거 아니야? 

A : 만약 수많은 데이터를 표시하려고 하면 OOP(Out of Memory : 메모리 용량초과)가 발생해.

 

만약, Facebook, Instagram이 ScrollView로 그 많은 데이터를 사용자에게 제공한다고 생각해보면 우리의 작고 귀여운 디바이스는 버티질 못한다..

 

그걸 해결하기위해, 일정한 양식(틀)을 만들어두고 안에 데이터만 조금씩 수정하여 표시해주는 ListView로 사용을 한다. (물론 RecyclerView를 사용한다.)

 

심지어 여기서 일정한 양식또한 화면에 표시되는 만큼만 만들어두고 스크롤을 하여 사용자 입장에서 더이상 안보이는 아이템이 있으면 다음 등장할 아이템으로 바꿔서 표시된다. 그럼 사용자가 보기에 아무리 빨리 스크롤을 내리거나 올려도 모든 데이터가 마치 원래 다 로드 되어있던것 처럼 보이게 된다 .

 

내가 말로 표현하기도 어렵고 사진으로 간단하게 표현되는 게 있어 첨부해본다.

사진을 보면 스크롤을 함으로써 디바이스 화면으로 부터 벗어나는 아이템은 다음에 나올 데이터를 받아 표시될 준비를 한다.

 이게 ListView의 재사용성이다. 그리고 이걸 ListView가 구현하는 로직이 바로 ArrayAdapter의 getView() 메소드에 구현이 된다.

 

이건 내가 만든 간단한 학생 데이터를 표현하는 StudentAdapter 클래스의 getView 부분을 캡쳐 해온 것이다.

 

과정을 정리해서 말하면,

 

1. convertView가 null이라면 미리 만들어둔 아이템의 틀(~~list_item.xml)을 인플레이트 해준다.

2. 이 때 인플레이트가 발생 할 때마다 로그를 띄워준다. 

3. 1에서 convertView의 null check가 이루어졌기 때문에 return할 row에 대입한다.  

 

이건 실제 에뮬레이터 실행 화면인데 한 화면에 표시되는 아이템의 개수는? 총 9개다.

 

 

그리고 로그캣을 보면 총 9번 convertView가 null 이 었다는걸 알수 있다.

 

반대로 말하면 만약 10번째 데이터를 보여줄땐 convertView가 null이 아니라는 얘기다. 

 

이게 바로 convertView의 역할이다. convertView는 10번째 데이터를 불러올 때 새로 inflate를 받지 않고 convertView를 돌려가며 사용한다. 

 

예를 들어,

ListView 아이템이 1 2 3 4 5 6 7 9 이렇게 나타나는데 사용자가 스크롤을 내려 2 3 4 5 6 7 8 9 10을 보여줘야한다면 처음 1~ 9까지는 inflate를 받아 새로 아이템을 표시하고 , 10부터는 스크롤을 올림과 동시에 사용자에게 보이지 않는 아이템 즉,  1을 데이터를 10으로만 바꾸고 사용자에게 표시된다. 

 


결론

정리하자면 convertView로 화면에 표시될 양의 View만 만들어두고, 계속 데이터만 갈아 끼우면서 우리에게 보여줌과 동시에 성능적인 이점을 챙길 수가 있고, OOM(메모리 용량 초과)으로부터 자유로워질 수 있는 것이다.

댓글