正如許多人一樣,我使用一個ListView :(的ListView IllegalStateException異常的列表中不添加刪除元素
java.lang.IllegalStateException當越來越IllegalStateException異常:適配器的內容發生了變化,但ListView控件沒有收到。通知確保您的適配器的內容不是從後臺線程修改,但只能從UI線程
我知道基本的解釋 - 我可能試圖修改從後臺線程列表中經過探索。我的代碼一遍又一遍,我無法找到一個地方,我實際上這樣做。我不添加\從列表中刪除元素 - 它是靜態的,並且不會從創建中更改。 我在做什麼只是修改內部數據的工作線程列表中的元素 - 但我不知道它是否真的是我的問題。 所以 - 這是我的問題 - 只要我不通過添加\刪除元素來修改列表本身,是否允許從後臺線程修改列表元素的底層數據?
更新: 嗯,我想你是對的,所以這裏是一個僞代碼:
//from main GUI thread.
ArrayList<People> namesList = // create and populate the list...
//lets assume that NamesArrayAdapter extends ArrayAdapter<People>
NamesArrayAdapter adapter = new NamesArrayAdapter(context, listViewResource, namesList); //instantiate the list adapter
//from backgroung thread
namesList.getItem(0).setName("et"); //Modifying existing element inside the list - is this ligal???
M Mohsin Naeem,謝謝你的回覆。我是否需要從後臺線程調用此方法?我應該在更新之前還是之後執行此操作?我的意思是,理論上,可能會在更新和notifyDataSetChanged調用之間有一個上下文切換。這不會是一個問題嗎? –
'notifyDataSetChanged'只能在主線程 –
上調用以避免任何混淆總是將私有List設置爲適配器。並且當您完成更改時,在該方法更新中的'UI線程'上調用方法say..'updateContent'您的適配器的私有列表並調用'notifyDataSetChanged' –