안녕하세요 갤러리를 만들고 있는데요. baseAdapter 에서 이미지가 자꾸 바껴나와서 질문 드립니다.
public View getView(int _position, View convertView, ViewGroup parent) {
position = _position;
if (convertView == null) {
convertView = inflater.inflate(image, parent, false);
galleryChild = new GalleryChild();
galleryChild.ptz = (PinchToZoom) convertView.findViewById(R.id.image);
galleryChild.loader = (ProgressBar) convertView.findViewById(R.id.loader);
convertView.setTag(galleryChild);
}
else
galleryChild = (GalleryChild) convertView.getTag();
// 1번 방법
galleryChild.bmp = LoadBitmap(dataList.get(_position));
galleryChild.ptz.setImageBitmap(galleryChild.bmp);
// 2번 방법
galleryChild.ptz.setImageBitmap(bm.loadBitmap(dataList.get(_position)));
return convertView;
}
일단 설명드리면 1번 방법은 스레드 작성한코드입니다.
2번 방법은 스레드 없이 바로 비트맵 디코딩해서 가져 오는 코드입니다.
2번 방법으로 했을때는 이미지가 제대로 맞게 나오는데요.
1번 방법으로 했을때는 이미지가 엉켜서 나옵니다.
1번의 경우 notifyDataSetChanged() 했을때 이미지가 다시 바뀌기도 하는데요..
로그를 찍어보면 LoadBitmap 함수에서 리턴 받는 비트맵이 getview() 처음 호출시 null로 나오는데요.
그런데 궁금한게 그뒤로는 getview() 호출시 null이 안나오고 아마 이전에 로드됬던 bitmap이 나오는데요.
구조적으로 어떻게 손을 봐야할지 감이 안잡힙니다. 하루종일 삽질하고 있는데 좀 도와주세요 ㅠㅠ
함수 설명하고 dataList에 들어있는 값이 무엇인지 제대로 몰라서 제대로 파악했는지 모르겠지만,
1번 방법에서 LoadBitmap()이 함수안에서 쓰레드로 이미지를 가져오는 기능이라면
galleryChild.ptz.setImageBitmap(galleryChild.bmp); <--여기에서 처음에 galleryChild.bmp = null 인게 당연합니다.
왜냐하면 쓰레드는 메인쓰레드랑 비동기로 작업을 하기때문입니다.
LoadBitmap()에서 쓰레드로 이미지를 불러오는 중인상태에서 galleryChild.ptz.setImageBitmap() 이걸 실행하면 galleryChild.bmp여기 값이 있을까요?? 가져오는 중이니깐 당연히 없겠죠..
스크롤 했을때도 마찬가지겠죠. 이전에 가져온 값을 세팅하게 되니깐 켜자마자 이미지가 로딩하기전에 스크롤하면 밑에 이미지도 제대로 안나올거고 조금 천천히 스크롤하게되면 리스트 제일 위에 보여야 할 이미지가 화면에 안보였던 최상단 리스트아이템에 세팅되서 보일겁니다..
쓰레드를 사용하려면 LoadBitmap(dataList.get(_position)); 작업이 다 끝난다음에
galleryChild.ptz.setImageBitmap(galleryChild.bmp);이걸 사용해야 제대로 이미지가 보일겁니다.
쓰레드 관련된 작업은 동기화가 좀 필요한데 이게 처음해보면 어려울수있어요~ 화이팅하세요 ㅎ