我有一個ListView由一個SimpleAdapter填充,它從一個ArrayList的HashMap獲取值。 ArrayList是通過從我的站點獲取數據的方法load()
構建的。我有一個菜單選項,允許通過再次獲取刷新數據並調用adapter.notifyDataSetChanged()
,它實際上工作正常,更新數組列表並刷新ListView。現在,load()
需要幾秒鐘來建立http連接並獲取數據,所以我想設置一個ProgressDialog來通知用戶正在進行的過程。我知道我不能把ProgressDialog放在UI線程上,因爲load()
工作,所以我嘗試了一個AsyncTask。它工作正常,顯示對話框,而新數據被提取並傳遞給適配器,但它也增加了一個問題:ListView不再刷新顯示的項目,除非我將修改後的列表項目移出屏幕,回來,那麼它會顯示新的內容。我可以做什麼來同時進行ProgressDialog和列表內容的刷新?
這與ProgressDialog中的AsyncTask代碼(編輯數據,但不會觸發屏幕列表刷新):ProgressDialog,同時刷新ListView
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.update: {
loading.show(); //the ProgressDialog
AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
load(); //fetching data, takes a while
return null;
}
@Override
protected void onPostExecute(Void result) {
loading.dismiss();
}
};
loadingTask.execute();
adapter.notifyDataSetChanged();
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}
這是會刷新的ListView以及後面的數據的代碼(但不會讓我建立了一個ProgressDialog):
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.update: {
load();
adapter.notifyDataSetChanged();
return true;
}
default:
return super.onOptionsItemSelected(item);
}
}
也動'adapter.notifyDataSetChanged();''在onPostExecute()' – 2012-07-12 09:46:45
@MMohsinNaeem - 我的打字錯誤,我更新的答案。感謝它。 – user370305 2012-07-12 09:47:55
它的工作方式非常完美。非常感謝大家! – devrocca 2012-07-12 10:28:39