화면 전체를 탭바와 리스트 뷰로 구성을 하였고
리스트 뷰는 쓰레드를 통해서 서버로부터 데이터를 받습니다.
받는 데이터가 이미지+텍스트 이 형태라서
텍스트를 먼저 받은뒤
리스트의 invalidateViews()를 해서 화면을 갱신했습니다
리스트어뎁터의 notifyDataSetChanged()를 쓰지 않는 이유는 이걸 쓰면 리스트가 최상단으로 올라가버리길래
리스트 스크롤이 내려간 상태에선 올라가는거 방지하기위해 invalidateViews를 이용햇습니다.
텍스트전송이 끝난뒤에 이미지들만 받기위해서
반복문으로 이미지를 하나 받은뒤 또다시 invalidateViews()를 시켜서 화면을 구성했습니다.
전체적으로 이렇게 구성되어 있는데
문제가 쓰레드에서 갱신하는 방법이 틀린건지 잘될때는 잘 되다가
안될때는 다음같은 로그를 뛰우고 죽어버립니다.
06-18 04:41:55.054: ERROR/AndroidRuntime(268): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131165240, class android.widget.ListView) with Adapter(class com.smartcolor.ticketbene.ActivityGeneralList$GeneralListAdapter)]
private class UiHandler extends Handler{
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
switch(msg.what){
case handlerMsgReloadListView:
listView.invalidateViews();
break;
}
}
}
public void run(){
텍스트 데이터 다운완료
uiHandler.sendEmptyMessage(handlerMsgReloadListView);
이미지 데이터 다운 시작
for(){
이미지 1개 다운 완료
uiHandler.sendEmptyMessage(handlerMsgReloadListView);}
}
이렇게 되어있는데...죽는 이유를 당최 못잡겟습니다.
고수님들 좀 도와주세요 ㅠㅠ
아참 그리고 list.invalidateViews() 말고 또 화면을 갱신시키는 다른 방법이 존재하는지 궁금합니다.
<meta charset="utf-8"><meta charset="utf-8">adapter를 이용해서 notifyDataSetChanged를 쓰니깐 스크롤이 최상단으로 올라가더라구요 이유는 뭐때문인지는 모르겟는데 상단에 올라갈 필요가 없어서 어쩔수 없어 invalidateViews를 이용하였습니다. 음 그리구 이미지랑 텍스트를 담는 클래스는 이미 정의해 놓은 상태인데 이미지와 텍스트가 1:1 비율이라서 텍스트를 먼저 다운받고 그후에 이미지만을 따로 다운받게끔 하였습니다. 흐음 다운받는 아이템항목이 대충 10개 정도씩 해노았는데 이게 갱신과 다운동기화가 안되서 이러는건지 에휴 모르겟네요
1. 흐음 결국 리스트뷰와 어뎀터 사이의 동기화 문제 같은데 이부분은 어떻게 수정을 해줘야 될지 감이 안잡히네요 스크롤 다운은 모르겟지만 동기화는 제 나름대로 처리 했다고 생각했는데 이부분이 문제가 있을수도 있겟네요 이미지를 다운 받는 시간이 변칙적이라서 이럴수도 있겟네요.. ㅠㅠ 에휴
2. 근데 전 adapter의 nofityDataSetChanged 를 호출하면 왜 최상단으로 가버릴까요 -_-;;;;;;;
게다가 데이터를 하위로 넣어줘야 되는 게 각각 다운받는 컨텐츠들을 최상단부터 뿌려줘야 하기때문에 상위로 넣는 방법은 불가능 할듯 하네요 서버에서 포인트를 줘서 구분이 되게끔 이미 구성이 되어 있고 아이폰은 문제없이 작동하는 중이라서 이부분을 수정할려면....에휴 한참 더걸릴거 같은데요 ㅠㅠ




ListView라면 adapter를 통해서 화면에 표현할 데이터를 전달하지 않나요? BaseAdapter나 또는 그걸 확장한 Adapter를 사용하신다면 notifyDataSetChanged 함수를 호출하시면 ListView를 자동으로 갱신해줍니다..CursorAdapter는 사용하시는것 같지는 않아보여서..
그리고 구조를 바꾸어 보셨음 하네요..아마 속도땜에 그렇게 하셨을것 같은데..이미지랑 텍스트를 받은뒤에 그때그때마다 핸들러를 통해서 메시지를 보내시는 듯 한데요..그러지 마시고..이미지와 텍스트 테이터를 한번에 모두 담을수 있는 클래스를 하나 정의하신뒤에 데이터를 받으면 정의한 클래스객체에 담아서 그거에 대한 Collection 객체를 통해 한번에 넘기는거죠..즉 모두 받은뒤에 한번에 넘기는 겁니다..물론 모두 받는 과정이 있어서 보여주는 속도가 느려질수도 있지만..그 건수가 얼마 안될때는 그닥 속도의 차이는 없습니당..추측에는 데이터를 받는것과 동시에 화면에 표출할려고 하다보니 그로 인한 문제인건가 하는 생각이 들어서..건수가 얼마 안되면 아예 한번에 다 받고 표현하는게 어떨까 해서요..