Android 에서는 component 들을 widget 이라고 부른다. 이번에 설명 해줄 widget은 ListView에 관한 것 이다.

어떤 data를 List 형태로 보여 주는 동작을 하고 싶을 때 이용 되는 widget 으로 data와 Adapter라는 controller
그리고 Listview가 있어야 한다.

Adapter는 ListView를 control 하기 위해 사용 된다.
어떤 식이냐면 Adapter에는 base method(기본 동작 함수)로 getCount() 라는 함수가 있다. 
이녀석은 ListView에 나타날 총 item 목록의 갯수를 알려 준다. 이녀석은 ListView에서 나름 중요 한 녀석(?) 이다.

ListView는 자신의 UI 크기에서 개별 item의 UI 크기  (위 그림에서 "Android 1" 이라고 써져있는 item 하나의 크기)를 계산해서 한 화면에 item을 몇 개를 뿌릴 수 있는지 계산한다. - 위 그림 대로 계산하면 대략 6이 나온다.

ListView가 그리릴 수 있는 내용은 최 상단의 item 의 index 값(item의 실제 순서 정도로 이해 하면된다) +  한 화면에 6개의 item을 그릴 수 있으니까 index + 6이 될 것이다. 이렇게 수행 하면서 scroll 하면 계속해서 갱신 해간다. 최종 목적지는 getCount 에서 얻어진 숫자 만큼 item을 그리도록 한다.

그럼 만약 getCount에서 인위적으로 1 이라고 처리를 한다면 총 갯수가 1개 이므로 볼것도 없이 item은 1개만 그린다.
이런식으로 인위적으로 ListView를 손질 할 수 있다.

Item의 개별적인 display를 담당 하는 Adapter의 method는 getView(...) 이다.
원래는 getView(...)에서 처리를 하는데 Adapter의 종류에 따라 종종 bindView(...) 라는 녀석도 있다.
무튼 getView(...)에 들어 오는 parameter 값을 보면 View 타입으로 convertView 인가? 하는 녀석이 있다.
이녀석이 item (제시된 image에서 Android 1 에 해당)을 display 하는 녀석이다.

그럼 ConvertView라는 녀석은 어디서 할 당 하냐면 getView를 최초 호출시 이값은 null 이다. 이때 newView(...) 라는 녀석을 통해 새로 생성 되도록 되어 있고 여기에는 Layout 파일을 지정 할 수 가 있다. (Adapter 생성시 넣을 수도 있음)

간혹 CustomItemView를 control 하다가 display가 엉망이 되는 경우가 있다고 한다.
(Checkbox 처리를 하다보면 자주 생김)  
원인 부터 알려 주자면 getView는 item 개별적으로 호출 되는데 convertView 이녀석 값은 돌려 쓰기 때문이다.
즉 getView가 호출되면 parameter로 convertView가 들어온다. 1번 item 일때 checkbox를 check 했다면 2번 item의 getView가 호출 되어 convertView를 확인 하면 내가 check 해주지 않아도 check 되어 있다.

해결 책은 converView를 초기화 하던지 if문과 else 문을 쌍으로 써주는 것이다.

ListView에서 data 부분은 대체로 Cursor(SQL query 결과물), Array인데. 둘다 getView에서 data를 꺼내서 convertView에 붙이는 작업을 해야 한다. (뭐 제공되는 Simple... 이런녀석들도 전부 이런 작업을 해준다.)

'Android' 카테고리의 다른 글

Android List에 index를 표시해보자 3편  (0) 2012.02.08
Android List에 index를 표시해보자 2편  (0) 2012.02.08
Android List에 index를 표시해보자 1편  (0) 2012.02.08
Android - Activity  (0) 2011.10.02
Android 시작  (0) 2011.09.20

+ Recent posts