android ListView Adapter의 getView 메소드에 대한 이해

프로그래밍/Android 2013. 9. 24. 21:57

android 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 가 생성된 것처럼 사용자에게 표시해 줍니다.


끝.





: