안드로이드 개발 질문/답변
(글 수 45,052)
잘 모르는게 있어서요.
ListView 위에 이미지 및 텍스트로 된 내용들을 담고 있는 중입니다.
이미지와 텍스트 내용 모두 SQLite 를 이용하여 저장했고, 꺼내 오는것도 잘 확인됩니다.
문제는,,, 제가 정확히 모르고 넘어가는 것들이 많다는 겁니다.
궁금한 것들은 이렇습니다.
1. SimpleCursorAdapter 를 사용하면, 그 내부에서 cursor 의 moveToNext() 등이 알아서 호출됩니까?
SimpleCursorAdapter와 ListViewActivity를 사용한 예제들을 보면, 모두 moveToNext() 처럼 커서 옮기는 호출이
없더라구요.
2. 그런데, 제가 SimpleCursorAdapter 를 상속해서 커스텀 아답터를 만들었는데 ,,,
( 커스텀 아답터를 만든 이유는, getView를 오버라이드 해서 리스트 위에 이미지를 출력하려고 한겁니다. 출력은 잘 됩니다)
커스텀 아답터를 사용하니까,
moveToFirst() 를 호출안하면 아무것도 안나오면서 프로그램이 죽더라구요. ㅡㅜ
그래서 setListAdapter() 를 호출하기 전에 moveToFirst() 를 해주니까, 나오긴 하는데 맨처음 레코드만 계속 나오구요.
그래서, 커스텀 아답터 내부의 getView() 내부에서 항상 moveToNext() 를 호출하니까 이제 잘 나오는가 싶더니...
리스트뷰를 위로 아래로 계속 스크롤하다보면 프로그램이 죽습니다.
정리하면, 질문이 결국,,,
- SimpleCursorAdapter 는 디비쿼리의 cursor 를 넘겨주면, 자기 내부에서 moveToNext 등을 알아서 수행하나요?
- moveToNext() 를 getView() 내부에서 호출하는것 이외에 뭘 더 해주어야 리스트뷰를 계속 스트롤 업/다운 해도 안죽을까요?
ㅡㅜ
일단 리스트와 어댑터의 관계를 먼저 정리해봐야 할거 같습니다.
리스트는 자신이 현재 화면에 보여줘야 하는 뷰를 관리하고 그 뷰의 생성 및 초기화는 어댑터가 담당합니다.
리스트가 어댑터로부터 원하는 위치의 뷰를 얻어서 화면에 뿌린다고 보면 됩니다.
getView를 보면 반드시 convertView와 position이 넘어오게 되어있는데요...
실제 리스트뷰에서 자신이 재활용하는 뷰를 convertView에 넘겨주고
그 뷰에 몇번째 데이터를 채워달라는 의미로 position을 넘겨주면서 호출합니다.
getView는 순차적인 것이 아니라 리스트가 주는 position에 맞는 데이터를 채워줘야 하는 것이지요...
커서의 경우는 moveToPosition이 있습니다. 이걸 활용하면 됩니다.