안드로이드 개발 질문/답변
(글 수 45,052)
sd카드에서 이미지를 읽어서 보여주는 커스텀아답터를 만들고 있는데 여기서 검색하여 나온 커서아답터를 상속받아 구현하는 아답터는 에뮬레이터에서는 되는데 실제 기기테스트에서는 안돌아갑니다.
그래서 이게 커서아답터의 문제인가 싶어서(왠지 느낌은 바인드뷰에서 비트맵생성이 따로 쓰레드가 돌아서 생성되기전에 없는 이미지를 이미지뷰에 올리려니 충돌나는 느낌?)
베이스아답터를 상속받은 커스텀아답터를 써볼까하다보니...미리 커서를 uri로 분리해서 그냥 다른 아답터에서 getview로 써도 되지않나요? 있으니까 쓴다면 할말은 없습니다만, 애초에 커서아답터의 바인드뷰방식이 약간 문제를 내포하고 있다는 말도 들었구요.
커서아답터의 장점을 아시는분은 답변 부탁드립니다. 그리고 추가로 커서아답터상속를 통한 커스텀아답터를 이용해서 sd카드의 이미지를 보여주는게 왜 실제폰에서는 안돌아가는지 이유도 아시는분은 답변 부탁드립니다.
p.s 베이스아답터통한 커스텀아답터에서 position이 이상하게 잡히는(아이템이 7개인데 0,1,2,3,4,5,0으로) 문제가 있네요. 이것도 이유아시는분은 답변 부탁드립니다.
2010.08.20 16:22:47
커서 어댑터는 말그대로 선택이긴 합니다.
커서의 데이터들을 필요한 부분만 배열화 해서 ArrayAdapter 상속한 커스텀 어댑터 쓰는것도 관계는 없습니다.
커서 어댑터는 장점이라면 로직이 단순해진다는 점입니다.
뷰 바인더만 잘 만들어 주면 알아서 척척 붙습니다.
(SimpleCursorAdapter 기준으로...) 단점이라면 bindView라는 과정이 중간에 붙어있기 때문에
화면에 리스트뷰가 있고 새로고침을 자주하는 케이스에 대해서
상당히 난해한 점이 많이 발생합니다.
특히 그중 하나가 이미지뷰에서 잠깐 다른 이미지가 나오는 케이스인데요.
이걸 막으려면 제 경험상 재활용 안하는 방법밖에 없는데...
이것에 의해서 메모리 릭이 발생합니다.
다른 어댑터도 재활용 안할때 릭이 뜹니다만...
이넘은 스케일이 큽니다. 폰이 죽는 방향으로 갑니다.
다른 어댑터의 경우는 릭은 있지만 폰이 죽는건 못봤습니다.
커서의 데이터들을 필요한 부분만 배열화 해서 ArrayAdapter 상속한 커스텀 어댑터 쓰는것도 관계는 없습니다.
커서 어댑터는 장점이라면 로직이 단순해진다는 점입니다.
뷰 바인더만 잘 만들어 주면 알아서 척척 붙습니다.
(SimpleCursorAdapter 기준으로...) 단점이라면 bindView라는 과정이 중간에 붙어있기 때문에
화면에 리스트뷰가 있고 새로고침을 자주하는 케이스에 대해서
상당히 난해한 점이 많이 발생합니다.
특히 그중 하나가 이미지뷰에서 잠깐 다른 이미지가 나오는 케이스인데요.
이걸 막으려면 제 경험상 재활용 안하는 방법밖에 없는데...
이것에 의해서 메모리 릭이 발생합니다.
다른 어댑터도 재활용 안할때 릭이 뜹니다만...
이넘은 스케일이 큽니다. 폰이 죽는 방향으로 갑니다.
다른 어댑터의 경우는 릭은 있지만 폰이 죽는건 못봤습니다.
소스보고 돌려보고 해야 결론이 나는 경우가 많거든요.
포지션이 이상하게 잡힌다고 하는데 getView에서 로그에 찍히는 순서만 보고 판단하시면 안됩니다.
ListView가 자기 하위 아이템의 View를 관리하는 방식은 우리가 생각하는것 이상으로 복잡합니다.
그냥 오는 포지션에 맞게 잘 맞춰서 넘겨주기만 하면 나머지는 리스트뷰가 알아서 합니다.
뷰에대한 리사이클 관리등은 리스트뷰에 다 구현되어있는 사항이니까요.