기존에 쓰는 방식은 getView시에 inflate 하여 ImageView를 findVIewById 하여 생성한 후
웹 다운로드 이미지 쓰레드를 돌려서 다운이 완료되면 setImage를 시키고 이미 해당 position의
Drawable이 다운로드되어 저장 되어 있는 경우(HashMap에서 url을 key로 사용하고 Drawable을 value로 사용 하여 검색)
받아둔 Drawable을 setIamge 하도록 되어있습니다...
이 방식의 문제점은 해당 ImageView가 없는 row도 있고 있는 row도 있어서 Visible은 GONE으로 xml을 작성하였고
이 이미지를 보여줘야 할 때만 Visible을 VISIBLE로 해주고 이미지 다운로드 쓰레드를 돌리도록 구현되어 있습니다..
문제는 이 ImageView가 row의 높이를 결정짓는다는 것입니다....
getView가 호출될땐 기본 visible이 GONE이라서 row의 높이가 짧다가 이미지가 다 받아지면 visible이 VISIBLE로 되면서
높이가 훅~ 늘어나면서 이미지가 뜨는겁니다....
그래서 이미지를 보여줘야 할땐 visible을 VISIBLE로 먼저 바꿔주고 이미지 다운로드 쓰레드를 돌리게 했음에도 불구하고
스크롤이 될때 row가 푹 푹 늘어나면서 위로 튀는 현상이 유지되네요....
그리고 public View getView(int position, View contentView, ViewGroup arg2) 함수에서 두번째 파라미터 View contentView를 사용하지 않았었는데
이 View를 활용하면 좀 더 ListView를 최적화 할 수 있다고 해서 써봤더니 이것도 View를 재사용 하는 방식이라
레이아웃은 같지만 컨텐츠가 다른게 떠서 결국 setImage, setText 등등의 컨텐츠는 어차피 새로 셋팅을 해야하더라구요
그래서 이미지 쓰레드를 getView 시마다 호출되게 구현하였더니 이전에 쓰였던 이미지가 먼저 보이고 0.몇 초 후에 해당 position의
이미지가 뜨는 현상이 있더라구요... ㅠ_ㅠ
ListView와 getView.... 이거 어떡해야 제대로 만들 수 있으까요...
한번 불러온 이미지는 꼭 거기에 박혀있는 것처럼 깜빡 거리지도 않으면서 부드럽게 스크롤 되길 원하는데....
그게 잘 안 되네요...
위의 문제들이 있어서 ArrayList mViews를 생성하여 View들을 만들어서 이 어레이에 다 넣어두고
getView에서는 mViews.get(position)으로 View만 불러와서 return 하게 하였더니 제가 원하는대로 한 번 로딩된 이미지는
화면에서 벗어났다 나타나도 깜빡 거리지 않으며 그 자리에 박혀있는 느낌이 들며 row의 높이도 휙휙 변하는 느낌이 들지 않는
완벽한 뷰를 제공하지만 이렇게 될 경우 100개의 View를 붙이게 되면 100개의 View를 다 갖고 있게 되는 메모리 문제가 발생되고...
화면에서 벗어난 이후 다시 getView가 호출 됐을때 setOnclickListener를 해둔게 잘 작동이 안 하는것 같기도 하고.. .무튼 이 방식은
피해야 할것 같은데... 어찌 해야할지 모르겠네요....
아니면 이 방식을 쓰면서 ListView를 쓰지 않고 그냥 ScrollView를 써서 LinearLayout에 addView로 붙여주는게 나을까요..? 근데 이것도
메모리 문제는 해결이 안 되는것 같네요.... ㅠ_ㅠ
먼저 답변 감사합니다
저도 검색 해보다가 저 View를 활용하는 법에 대해 확인하고 적용을 해보았는데요
ListView의 getView의 작동 메커니즘상 제가 원하는걸 얻기엔 불가능 할것 같아서요...
저는 빠르게 스크롤 할때도 해당 row의 이미지가 0.1초의 딜레이도 없이(만약 이미 받은 이미지라면) 뜨길 원하는데
getView시마다 View를 재설정(재활용 하기때문에 각 객체는 재활용한다 하여도 그 안에 들어가는 이미지나 Text는 재설정 할 수밖에 없는 성질)
해야 하기 때문에.... 왠지 불가능 할 것 같은 생각이 드네요 ㅠ_ㅠ
예를들면 이런거죠.... 만약 하나의 row가 아래와 같을때이죠....
1.
"TextView/안녕하세요~~"
======ImageView======
====================
====================
====================
====================
====================
======ImageView======
2.
"TextView/네~ 안녕하세요~~ 반갑습니다 ^^"
1처럼 ImageView가 있는 row도 있고 2처럼 ImageView가 없는 row도 있다면 스크롤을 세개 쫘악~~~~~ 올리거나 내릴때
ImageView가 없는채로(2처럼 TextView만 있는채로) 잠깐 보이고 쓰레드가 돌면서 이미지를 다운로드 하던가 또는 기존에
있는 받아둔 이미지를 보여주면서 visible이 VISIBLE이 되면서 row의 높이가 변해서 문제입니다... ㅠ_ㅠ




저 같은경우는
if ( contentView == null)
{
// 인플레이트
LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = mInflater.inflate(R.layout.main_store_item, null);
holder = new ListViewHolder();
holder.text = (TextView) mView.findViewById(R.id.tv_freecontent_vendor2);
holder.image = (ImageView) mView.findViewById(R.id.img_freecontent_thumb2);
mView.setTag(holder);
}
else
{
holder = (ListViewHolder) mView.getTag();
}
요런식으로 holder을 만들어 사용합니다
또한 이미지뷰의 경우 그냥 디폴트 이미지를 만들어 이미지뷰생성과 동시에 넣어주고.. 이미지파일을 받으면 이미지뷰의 파일만 교체해서 사용합니다..
그리고 이미지뷰는 그냥 크기고정...
DP로 넣어주면 해상도 따라 잘됩니다..