클릭됩니다. ^^
final View new_view = convertView;
final int new_position = position;
final long myItem = mItem;
mViewHolder.imgButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
((OnItemClickListener)mContext).onItemClick(null, new_view, new_position, myItem);
}
});
대략적으로 이렇게 getView 메소드 안에서 구현하시면 OnItemClickListener 이벤트가 됩니다.......
아마도 로그캣에 OutOfMemoryError bitmap size exceeds VM budge 이 뜨는것 같은데..
구글링이나 펍에 메모리 관련 검색해서 보시면
Bitmap 처리에 대한 답들이 많이 나와 있을 겁니다.. 찾아서 한번 해결해보시와요
Bitmap mBitmap = ImageLoadUtil.getOptimizeBitmap(path, getWindowManager().getDefaultDisplay());
public static Bitmap getOptimizeBitmap(String path, Display mDisplay) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, opt);
float wR = (float) opt.outWidth / (float) mDisplay.getWidth();
float hR = (float) opt.outHeight / (float) mDisplay.getHeight();
opt.inSampleSize = 10;
opt.inJustDecodeBounds = false;
Bitmap mBitmap;
mBitmap = BitmapFactory.decodeFile(path, opt);
return mBitmap;
}
제가 사용하는 이미지 로딩시 최적화 방법입니다.
이외에도 이미지 미사용시 recycle() 도 같이 사용해주고요
음.. 소스코드를 보니까 문제는 썸네일로 만드는게 아니네요
이미 insamplesize 다 하셧구 리사이징도 하셧네요..
아랫 분 답변처럼 getView를 하실때마다 bitmap를 new로 새로 선언하시는데..
그럼 리스트뷰를 스크롤 할때바다 계속 새로운 bitmap를 선언하게 되자나요 그럼 전에 선언한것도 모조리 다
heap에 쌓여서 결국 OOM을 띄우게 될거 에요
움.. 방법은 아마도 첨에 bitmap 변수를 하나만 선언하시고 돌려쓰기 하시거나
Bitmap 변수를 배열로 선언하세요.. 갯수만큼.. 그담에 포지션에 맞게 해당 비트맵을 불러오는게 좋을듯하네요
위 방법이 별루다 싶으시면 리스트뷰의 아이템이 보이지 않게 됫을때를 잡아내서 해당 bitmap을 recycle()! 뙇! 하시는것도
근데.. bitmap을 recyle()돌려도 GC가 바로 수거 하는게 아니라.. 걍 아랫분 말씀처럼 배열로 잡아서 처리하시는거 추천합니다.
움.. 리스트뷰의 방식은 모든 아이템을 미리 그려놓고 하는게 아니라 화면에 보이는 아이템을 포지션으로
판별해서 뷰에다가 그리는건데요..
아이템이 10개이거나 10000개 이거나 상관없이 현재 화면에 보이는 것만 그려서 보여주게 됩니다..
현재 화면에 3개의 뷰가 뜨게 하셧을때 보이는 아이템을 A,B,C라고 하면
첫화면엔 A = 1번 아이템 , B = 2번 아이템 , C = 3번 아이템 을 그리게 되지요?
아래로 스크롤링을 해서 한칸 내리게 되면 이때 리스트뷰에선 새로 아이템을 그리게 됩니다
A = 2번 B = 3번 C = 4번 이런식으로 말이죠 그래서 GetView에서 ConverView가 null이 아닐때와 null일때를 구별해서
그리는거죠 ConvertView가 null인 경우엔 가장 처음에 아무것도 그리지 않았을때고 null이 아닐때는 이미 A = 1번이 그려져 있어서
2번을 새로 그리게 되는겁니다. 이런식으로 매번 새롭게 그리게 되는데 지금 위에 코드를 보시면 Bitmap을 계속 그리시는데
이게 화면에서 보이지 않게 내려간다고 해서 달빅머신이 바로 수거를 안해가요.. 그러니 메모리 Heap 영역에 쌓이게 되지요
5번을 그리려면 새로운 메모리 공간을 달빅에 요청하게 되는데 이놈의 달빅이 메모리를 잘 안줘요..
그리곤 너 맘에 안들어 하고 내려버리죠 recycle()하신다 해도 마찬가지 일겁니다. 달빅은 지 맘대로니깐요..
그러니 한 3개의 Bitmap 변수를 잡으시고 거기다가 포지션에 맞는 아이템과 매칭을 해주시는 거에요
그러면 실제로 필요한 메모리 공간은 처음에 요청한 3개의 Bitmap 변수를 계속 재활용 해서 쓰는거니 달빅이
그나마 관대하게 봐주겟죠.. 문제가 있다면 위에 썸네일화 하지 않고 통으로 부를때라면 해당 비트맵을 다 부를때까지
아무짓도 못하니 리스트뷰가 버벅일수 있다는점!!




음...... 개인노하우 인데... 리스트에서 이미지 뿌릴때 이미지뷰말고 웹뷰를 써보세요.
mViewHolder.dateImage.loadData(
String.format("<html><body style='margin:0;padding:0;'><img src="\"%s\" width=\"100\" height=\"63\"></body></html>", mDatas.get(position).get("date_filename")),
"text/html",
"UTF-8");
아래처럼 이미지를 넣어주시고요... 클릭은 안될겁니다.
릴레티브 레이아웃에 웹뷰올리고 투명 이미지 버튼 올려서 이미지를 클릭하시면 퍼포먼스면에선 좋을거에요.