2012-07-12 77 views
0

我有一個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); 
    } 
} 

回答

0

剛剛從它添加AsycTaskonPreExecute()show()ProgressDialog。並將adapter.notifyDataSetChanged();放入的AsyncTask

一樣,

AsyncTask<Void, Void, Void> loadingTask = new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected void onPreExecute() {          
      loading.show(); //the ProgressDialog 
     } 

     @Override 
     protected Void doInBackground(Void... params) {     
      load(); //fetching data, takes a while 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      adapter.notifyDataSetChanged();           
      loading.dismiss(); 
     } 

    };   
    loadingTask.execute();  
    return true; 
+0

也動'adapter.notifyDataSetChanged();''在onPostExecute()' – 2012-07-12 09:46:45

+0

@MMohsinNaeem - 我的打字錯誤,我更新的答案。感謝它。 – user370305 2012-07-12 09:47:55

+0

它的工作方式非常完美。非常感謝大家! – devrocca 2012-07-12 10:28:39