티스토리 뷰

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(xxxxxxxxxx, class xxxxxxxxx ListView) with Adapter(class xxxxxxxxxxx listAdapter)]


리스트뷰를 사용하다보면 간간히 접하는 오류이다.


문제는 별별 상황에서 이 오류가 나타난다는 것이다.


인터넷에 떠도는 해결 방법으로는 특정 상황에서 발생하는 문제를 해결하지 못했다.


구글링을 믿었는데 안나오더라....


그 특정 상황이라는 것은


스크롤을 몹시 빠르게 연속에서 내리는 것을 시도할 때, 특히 AsyncTask 같은 비동기 방식으로 데이터를 동적으로 추가하는 경우 문제가 발생하는 것 같다.


스크롤이 마지막에 도착했을 때, 자동으로 다음 페이지를 동적 추가하는 코드인데,


터치 하고 손을 놓치 않는 상태에서 계속 아래로 스크롤을 시도하면 위의 오류가 발생했다.


하루 동안 삽질해가며 오류가 발생하지 않는 것을 보니 대충 완벽한 해결 방법이라고 해도 될 것 같다.


일단 ListView를 상속받은 Custom ListView를 만든다음. 아래의 메소드를 재정의 한다.


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    	try {
        	return super.dispatchTouchEvent(ev);
		} catch (IllegalStateException e) { // Exception 오류가 발생했을 때,
			int index = getFirstVisiblePosition(); 
			View v = getChildAt(0);
			int top = (v == null) ? 0 : v.getTop(); // 현재 리스트뷰의 스크롤 위치를 얻어온다.
			setSelectionFromTop(index, top); // 현재 스크롤 위치로 다시 설정한다.
	    	return true;
		}
    }


만약, 스크롤 위치를 다시 설정하지 않는다면 오류는 발생하지 않지만 스크롤이 맨 위로 올라가게 된다.



댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크