android ListView Adapter의 getView 메소드에 대한 이해
프로그래밍/Android 2013. 9. 24. 21:57android ListView Adapter의 getView 메소드에 대한 이해
이번에 앱을 제작하게 되면서 그 동안 잘못 알고 있었던 중요한 것을 깨닫게 되었는데 처음부터 착각해서 인지 나름 큰 공부가 되었습니다.
앱을 제작하게 되면 흔히 사용하게 되는 것중 하나가 ListView 입니다.
ListView 에는 사용자에게 표시할 데이터를 제공하기 위해서 Adapter 를 생성해서 ListView 에 연결해 주게 됩니다.
그동안 착각했던 부분은 Adapter 에 있는 getView( int position, View convertView, ViewGroup parent) 메소드입니다.
getView 내에서 Adapter 에 있는 데이터를 가져와 매번 새로운 View 를 생성해서 리턴했습니다.
만약에 1 ~ 100 까지 숫자를 표시한다고 하면
public View getView( int position, View convertView, ViewGroup parent) {
convertView = new NumberView( getContext(), getItem( position));
return convertView;
}
이런 식으로 1~100 까지의 모든 View 를 생성했습니다. 사용자가 ListView 를 스크롤하게 되면 새로운 데이터를 표시하기 위해 매번 새로운 View 를 생성하게 됩니다. 위 코드는 새로운 View 를 생성하는데 시스템의 리소스를 많이 소비하게 됩니다.
그래서 가끔씩은 사용자가 스크롤 할때 버벅거림을 느낄 수도 있습니다.
변경된 코드
public View getView( int position, View convertView, ViewGroup parent) {
if ( convertView == null) {
convertView = new NumberView( getContext(), getItem( position));
}else{
((NumberView)convertView).reset( getItem( position));
}
return convertView;
}
위 코드에서는 convertView 가 null 일 때만 새로운 뷰를 생성하고 null 이 아닐 경우에는 reset 메소드를 통해 값을 재설정하고 있습니다.
어떻게 convertView 가 null 이 아닐 수가 있을까? 하고 고민했습니다.
ListView 에서는 내부적으로 View 를 재활용하여 리소스 낭비를 줄이고 있습니다.
위 ListView 는 1~100 까지의 숫자를 사용자에게 표시하는 목적을 가지고 있지만 사용자에게는 1~100 전부는 표시하지 못하고(화면 크기상) 일부분만 한 10개 정도만 보여주기 때문입니다. 따라서 사용자가 스크롤할때 사라지는 View 를 다시 재활용하여 사용하게 됩니다.
1~100 까지의 데이터를 표시하기 위해 100개의 View 가 필요한게 아니라 10 개 정도를 재사용해서 표시하게 되는 것이죠.
따라서 null 이 아닐 때는 스크롤시 사라진 View 가 인자로 넘어옵니다.
따라서 reset 으로 값만 살짝 변경해서 넘겨주면 ListView에서는 새로운 View 가 생성된 것처럼 사용자에게 표시해 줍니다.
끝.
'프로그래밍 > Android' 카테고리의 다른 글
AsyncTask 에서 뷰에 접근시의 동기화 처리 (0) | 2013.10.06 |
---|---|
안드로이드 ListView 스크롤시 배경색 변경 안되도록 (0) | 2013.09.27 |
greenDAO 두 Entity 간에 관계 설정하기 (0) | 2013.09.24 |
greenDAO insert 성능 향상시키는법 (0) | 2013.09.13 |
안드로이드 SqlLite Database ORM 프레임웤 greenDAO (0) | 2013.09.10 |