근데 여기에 패키지에 포함된 이미지 같은경우 리소스로 이미지뷰를 셋팅하는 식으로 하니 속도가 봐줄만한데
사용자의 프로필 사진 같은경우 단말에 일일이 저장할 수 없기에 웹에서 가져오게 됩니다...
지금 구현 상태는 초반에 리스트뷰를 사용하지 않고 LinearLayout에 row 하나하나를 생성해 addView 해주는 방식으로
구현하고 웹상의 이미지는 쓰레드로 구현하여 이미지를 모두 다운로드 하지 않은 상태에서 리스트를 노출 시키고
사용자의 입력도 받습니다. 사용자가 스크롤을 해나가던 무얼 하던 그 화면을 벗어나지 않는다면 쓰레드에서 이미지를
저장하는 대로 리스트뷰의 이미지뷰에 setBitmapDrawable을 해줍니다...
이런 방식으로 구현 하였다가 점차적으로 리스트뷰로 변화 시켜가는 중인데요....
기존의 방식의 경우 총 Row가 25개 라고 가정하면 25개의 정보를 모두 출력해두고 스크롤뷰로 스크롤하는 방식이었는데
리스트뷰의 경우 오로지 화면상에 요구되는 Row의 뷰를 그때그때 불러오는 방식이어서 패키지 안에 있는 이미지를 불러오는
경우엔 문제가 되지 않는데 웹에서 불러오는 이미지가 잔뜩 포함된 리스트의 경우 상당히 버벅 되네요...
당연한 결과인데...이걸 해결할 방법으로....생각 해본게....
기존의 방법에서 이미지를 쓰레드로 받아오듯이 쓰레드로 이미지를 저장하고 그 이미지의 리스트를 보관하고 있으면서
getView에서는 웹으로 요청하는게 아니라 그 이미지 리스트로 요청을 하고 결과가 있으면 setBitmap을 해주고 결과가 없을시
그냥 디폴트 이미지를 set 해주는방식으로 하면 어떨까 구상을 하고 있습니다...
너무 말이 길었는데요...
제 질문의 요지는.....
리스트뷰에서 웹상의 이미지를 활용할 시 효율적인 출력방법이 무엇인가 하는 질문 입니다....
item으로 그릴려는 이미지가 로컬에 있으면 그걸로 그리고 없으면 로컬에 다운받아서 이후부터는 그것을 이용..하는 형태로 구현하는 건 어떨까하네요.
이미지를 로컬에 캐싱하는 방법도 생각해 볼 수 있는데요.
캐싱된 데이터를 읽어 들일 경우에는 빠르지만.. 새로 다운로드 받아야 하는 경우에는 Stream 으로 바로 읽는 것보다 매우 느리죠.
그리고 웹 상에 데이터가 계속 바뀌는 데이터의 경우에는 캐싱 하는게 별로 소용이 없구요.
말씀하신대로 쓰레드로 데이터를 요청해야 합니다. 저의 경우 ImageDownloader 라는 객체를 따로 만들었죠..
이 객체에 url List 를 던져주면 로드가 완료 되면 핸들러에 Steam 을 전달해주죠
그러면 해당 position 에 ImageView 에 setImage 해서 이미지를 설정해주면 되니까요.
스크롤이 멈췄을 때 화면에 보이는 애들만 로드를 하는게 좋은 것 같습니다.
아무래도 해시맵 같은것을 활용하는게 낫다고 보는데요...
저의 경우 (물론 다운로드는 아니고 단순히 이미지 로드지만 방식은 다를게 없을겁니다.)
두개의 해시맵을 활용합니다. 두개 해시맵 모두 키는 position 이구요
한개의 해시맵의 value는 AsyncTask, 다른 해시맵의 value는 Bitmap입니다.
(여기까지만 읽어도 대충 감이 오실지도..)
getView에서는 다른 처리 안하고...
해시맵에서 position에 대응하는 Bitmap을 찾아서 있으면 그냥 넣구요...
Bitmap이 없으면 AsyncTask가 있는지 체크합니다.
없으면 AsyncTask(이미지 로딩)가 있는지 확인해서 실행하고 있으면 그냥 기본이미지 채워서 패스하고
실행 안하고 있으면 AsyncTask를 실행합니다.
AsyncTask는 백그라운드에서 이미지 로딩을 실행하고,
로딩이 되면 UI스레드에서 notifyDataSet...()을 해줍니다.
이게 중요합니다. 그냥 컨트롤에 우겨넣으려고 해도 어차피 재활용땜시 섞이더군요 그냥 notify가 낫습니다.
이정도만 하면 앵간한건 다 자연스럽게 되긴합니다.
문제는 로딩이 느린데 스크롤 확땡기면 어쩔수 없이 버버벅합니다. 태스크가 많이 생기기 때문인데요...
그렇다고 태스크를 중간에 죽이고 화면에 보이는거 위주로 하기도 애매한측면이 있습니다.