티스토리 뷰

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.


영어를 해석해보면 어댑터의 데이터가 변경되었는데 리스트는 이 사실을 전달 받지 못했다.

어댑터의 컨텐츠를 백그라운드 쓰레드에서 변경하며 안되고, 메인 쓰레드(UI 쓰레드)에서 변경해야만 한다.


라고 한다.


문제는 이 내용이 2가지 사항에 해당하지 않더라도 시도 때도 없이 동일하게 나온다는 것이다.


답답해서 구글을 찾아보았으나 위 2가지 내용에 해당하는 해결 방법만 나와 있을 뿐,


급격하게 리스트뷰의 스크롤을 조작했을때 나타나는 문제를 근본적으로 해결하지는 못했다.


미치는게 천천히 스크롤하면 문제가 없고, 급하게 스크롤 할 때만 발생하다 보니


영어 실력이 부족해 단어 초이스를 잘 못하겠더라.


비슷한 문제를 겪는 분들도 있는 것 같은데 대부분 시간 지연을 주는 방법으로 해결 한 듯 싶다.


내가 해결한 방법은 조금 다른 방법으로, 완벽한 해결 방법이라고 볼 수는 없겠지만 최소한 내가 테스트할 때는 문제 없이 작동하는 것으로 보아, 비슷한 문제로 스트레스 받고 있는 분들에게 조그만한 도움이 되고자 알려드린다.


Activity단에서 adapter.notifiyDataChanged()를 사용하면 안된다.


반대로 ArrayAdapter에서 notifyDataChanged를 하게 한다.


방법은

public void refreshAdapter(ArrayList<String> items) {

  this.items.clear();

  this.items.addAll(items);

  notifyDataSetChanged();

}


이런 식으로 어댑터를 refresh할 수 있는 함수를 ArrayAdapter 내부에서 선언한다.


ArrayAdapter를 Activity에서 선언 할 때 사용 했던 데이터를 전부 지우고, 새로운 데이터를 집어 넣은 다음, 내용을 갱신해 주는 방법이다.


그리고 Activity에서 adapter.notifiyDataChanged()를 사용 했던 부분에서 adapter.refreshAdapter(items)를 호출 하면 잘 작동한다.


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