본문 바로가기

나의 플랫폼/안드로이드

[ Android ] GridView를 사용할 때 getView에 대한 이해!

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
안녕하세요. 
제가 이미지를 출력하는 GridView를 하다가 느낀 점을 적어볼까 합니다.

지금까지 전 GridView를 사용할 때  언제나,
getView에 이미지만 출력해주면 다 되는거 아닌가??
하는 식으로 BaseAdapter를 이용하여 마음 대로 View등을 리턴 시켰죠.

하지만, 제가 코딩을 해본 경험상!
무작정 마음대로 넘기는 형식이 아니더라구요.
특히, Scroll사용 시 이미지가 겹치거나 position에 맞지 않는 이미지가 나올 경우가 많아
Scroll이벤트와 함께 index를 억지로 맞춘 적이 많았습니다.
 

과연 이렇게 복잡하게 GridView사용하게 구글이 만들었을까요? 

소스 두개를 보여드릴께요. 

public View getView(int position, View convertView, ViewGroup parent) {

ImageView imageView;

imageView = new ImageView(mContext);

imageView.setLayoutParams(new GridView.LayoutParams(95, 95));

imageView.setAdjustViewBounds(false);

imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

imageView.setPadding(2, 2, 2, 2);

// 이미지 파일 id

           Bitmap bmp = Images.Thumbnails.getThumbnail(mContentResolver,

id, 

Images.Thumbnails.MICRO_KIND, null);

imageView.setImageBitmap(bmp);

return imageView;

}

 

    public View getView(int position, View convertView, ViewGroup parent) {

ImageView imageView;

if (convertView == null){

Log.d("DEBUG","position : "+position);

imageView = new ImageView(mContext);

imageView.setLayoutParams(new GridView.LayoutParams(95, 95));

imageView.setAdjustViewBounds(false);

imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

imageView.setPadding(2, 2, 2, 2);

}else{

imageView = (ImageView) convertView;

}

if(position < chacheImgList.size())

imageView.setImageBitmap(chacheImgList.get(position));

return imageView;

}

 
위 소스 둘 다 아마 탈 없이 이미지들이 로드 됩니다. 
( sd카드 이미지를 가져오는 소스를 원하시면, 적어 놓을께요. 검색해도 많이 나오니 안적었음^^;;)

첫번째는 이미지를 getView할 때마다 로드를 합니다.
사용자가 스크롤을 할 때마다 bitmap파일을 불러와서 imageView에 뿌린다는 소리죠.

이럴 경우, 스크롤할 때 항상 끊기는 현상이 일어납니다.

두번째는 bitmap파일을 이미 리스트에 추가 시켜 놓고,
position의 맞춰서 그때 그때 불러옵니다.

즉, 비트맵을 초기화 할 때만 불러오는 격이지요. 
그래서 스크롤을 할 때 끊기는 현상이 없어집니다.
함 해보시면 바로 몸소 느껴지실 겁니다^^

또!! 주의깊게 봐야할 점이 있습니다.
이런 생각을 할 수도 있습니다.


convertView가 null일 때만 , Bitmap을 만들어서 리스트에 넣으면 되지 않겠냐! 라는 생각.

제가 GridView를 테스트 해본 결과


getCount라는 GridView 갯수를 지정하는 함수가 있습니다.

이 함수 만큼 모든 View를 초기화 시켜 놓아 버립니다. 제 생각엔 가상머신이 알아서 해주는 것 같네요^^;


그래서 화면에서 보이는 부분은 getView를 불러서 적당하게 Bitmap을 불러와서 추가할 수 있지만,
보이지 않는 부분이 보여질 때는 이미 convertView가 null이 아니게 되는 것이지요!
( 별표 2000개 해주세요. )  
 


그래서, 위 두번째 소스 같이 Bitmap은 미리 초기화를 시켜 놓고,
아니면 Scroll이벤트를 그때 그때 파악하여 적정하게 초기화 시킨 후,
getView는 저렇게 사용하세요!!!! ㅋ

제 경험에서 나온 내용입니다.

참고하세요^^