2013-07-22 19 views
0

我正在使用不同的Thread來清除適配器的List,有時我得到一個IndexOutOfBoundsExceptionListView和線程安全的自定義適配器

我想問題是在自定義適配器填充ListView的進程中間的某個地方,第二個線程調用list.clear()導致list.size()返回0,從而導致某處出現界限。

如何使這個線程安全與同步(在這種情況下,這將解決它)?

//onCreate 
fillList(list); // fills the list 
new AsyncTaskSubclass().execute(); // clear the list on a different Thread 

編輯:我認爲這個問題涉及的事實AsyncTask被清除了ArrayAdapter子類使用名單,有沒有辦法來改變適配器使用List

回答

1

你可以使用一個同步的名單:

List<Item> list = Collections.synchronizedList(new ArrayList<Item>()); 
+0

我正在從服務器獲取新數據,這就是爲什麼清單被重新填充到單獨的線程中。這個解決方案適用於這種情況嗎? –

+0

不,它仍然引發異常 –

0

這將是很好的有一些更多的代碼。

如果使用AsyncTask你應該打電話publishProgress()doInBackground()方法時要清除掉,然後再做到這一點清楚onProgressUpdate()add()remove())。您應該避免從UI線程之外操作UI元素。

爲什麼不用新的List設置一個新的Adapter?因此,您可以異步烹飪您的列表,然後在UI線程中調用ListView.setAdapter()(例如,在onProgressUpdate()onPostExecute()中)。

相關問題