내가하고 싶은 일 : 결과가 계산되는 동안 ListView 내용을 계산하고 ListView를 부분적으로 업데이트하는 백그라운드 스레드를 실행하십시오.
내가 피해야 할 것 : 백그라운드 스레드에서 ListAdapter 내용을 망칠 수 없으므로 AsyncTask를 상속하고 onProgressUpdate에서 결과를 어댑터에 추가합니다. 내 어댑터는 결과 객체의 ArrayList를 사용하며 해당 어레이 목록의 모든 작업이 동기화됩니다.
다른 사람들의 연구 : 여기에는 매우 귀중한 자료가 있습니다 . 또한 ~ 500 명의 사용자 그룹에 대해 거의 매일 충돌이 발생 list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
했으며 onProgressUpdate 에 블록을 추가 하면 충돌이 10 배 감소했지만 사라지지 않았습니다. ( 답변 으로 제안되었습니다 )
내가 때때로 얻는 것 : 실제로는 거의 발생하지 않습니다 (3.5k 사용자 중 한 주에 한 번). 그러나이 버그를 완전히 제거하고 싶습니다. 부분 스택 추적은 다음과 같습니다.
`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(2131296334, class android.widget.ListView) with Adapter(class com.transportoid.Tracks.TrackListAdapter)]
at android.widget.ListView.layoutChildren(ListView.java:1432)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:2062)
at android.widget.ListView.onTouchEvent(ListView.java:3234)
at android.view.View.dispatchTouchEvent(View.java:3709)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
[...]
도움? 더 이상 필요하지 않습니다. 아래를 참조하십시오.
최종 답변 : 결과적으로 notifyDataSetChanged
깜박임과 급격한 목록 변경을 피하기 위해 5 회 삽입 할 때마다 전화 를 걸었습니다. 기본 목록이 변경되면 항상 어댑터에 알리십시오. 이 버그는 오래 전에 사라졌습니다.