2011-09-04 82 views
3

我有一個自定義列表視圖,每個條目包含旋轉ProgressBar和單行textview。我總是隻更新列表中的第一項。問題是每次我調用notifyDataSetChanged時,所有可見的視圖都會被重新創建或作爲convertView被回收。Android ListView notifyDataSetChanged

有2個問題,這種方法:

  • 所有條目重新創建,這就是慢 - 作爲我的第一個條目

  • 的進度動畫只更新TextView的,這不是必需的每次都重新啓動

所以我儘管我會保留對適配器中的第一個視圖的引用並手動更新它。它工作,但它隨機拋出IllegalStateException(「適配器的內容已更改,但ListView沒有收到通知。請確保您的適配器的內容不是從後臺線程修改,但僅從UI線程修改。」)

我該如何解決?有沒有辦法通知ListView只有第一個條目改變了?即使有,ProgressBar動畫仍然會失敗。有沒有其他的方法來手動更新它?

感謝

+0

你能證明確實更新的代碼。從消息看來,您可能正在通過非UI線程更新UI(例如AsyncTask中的doInBackground()) – momo

+0

發佈太複雜,但它在UI線程上。問題在於不調用notifyDataSetChanged,正如我在我的問題中解釋的那樣。 –

+0

我有同樣的問題。我在UIThread中使用了關於列表和適配器的所有方法。但隨機拋出這個異常。你如何解決它? – atasoyh

回答

0

每當我需要在一個ListView我用這個更新一個單一的項目:

public void updateItemAt(int index) { 
    View v = listView.getChildAt(index - listView.getFirstVisiblePosition()); 
    if (v != null) { 
     //updates the view 
    } 
} 

的缺點是,你需要在你的適配器來保存到ListView的參考。 因爲這些代碼通常是從後臺任務調用,你必須使用一個處理程序來調用它:

Handler myHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     int index = msg.what; 
     myAdapter.updateItemAt(index); 
    }; 
}; 

//when task is complete: 
myHandler.sendEmptyMessage(index); 
+0

請再次閱讀該問題。即使從UI線程進行更改,ListView也需要調用notifyDataSetChanged。你的解決方案也會隨機拋出提到的異常。 –

相關問題