2011-02-13 92 views
0

我是Android的新手,我有一些與AsyncTask類的問題。我有很多(超過100個)複選框,我想選擇或取消選中「全選」複選框。 不幸的是,這需要相當長的時間,對於用戶來說很明顯,所以我想使用ProgressDialog來顯示正在進行的選擇。Android的ProgressDialog,同時選擇和取消選擇複選框使用AsyncTask

現在我知道UI元素的更新應該在UI線程中完成,因此我在onProgressUpdate方法中選擇了代碼,但ProgressDialog直到處理時才顯示出來(選中或取消選中所有複選框)已完成...

這應該怎麼做?有沒有解決方法或其他解決方案?我也嘗試通過doInBackground()方法中的所有複選框,但我得到了很多奇怪的錯誤(我猜這是因爲UI)。

這是我的代碼:

customPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

     @Override 
     public boolean onPreferenceChange(final Preference preference, final Object object) { 
      new CbSelection().execute(preference); 
      return true; 
     } 
}); 


private class CbSelection extends AsyncTask<Preference, Boolean, Void> { 

      private ProgressDialog Dialog = new ProgressDialog(Preferences.this); 

      @Override 
      protected void onPreExecute() { 
       Dialog.setMessage("Please wait..."); 
       Dialog.setCanceledOnTouchOutside(true); 
       Dialog.setCancelable(true); 
       Dialog.show(); 
      } 

      @Override 
      protected Void doInBackground(Preference... pref) { 

       PreferenceScreen screen = (PreferenceScreen)getPreferenceScreen().getRootAdapter().getItem(2); 

       Preference preference = pref[0]; 
       if(preference.getKey().compareTo("select_all") == 0){ 
        publishProgress(true); 
       } 
       return null; 
      } 

      @Override 
      protected void onProgressUpdate(Boolean... ok) { 
       if(ok[0]== true) { 
        PreferenceScreen screen = (PreferenceScreen)getPreferenceScreen().getRootAdapter().getItem(2); 
        for(int i = 0; i < screen.getPreferenceCount(); ++i) { 
         //Dialog.show(); 
         /* select or deselect all checkboxes here... */ 
        } 

       } 
      } 

      @Override 
      protected void onPostExecute(Void v) { 
       Dialog.cancel(); 
      } 
} 

回答

0

,如果你創建並顯示在執行AsyncTask前的對話麼?這是它通常使用的方式:

private ProgressDialog Dialog; 
customPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

     @Override 
     public boolean onPreferenceChange(final Preference preference, final Object object) { 
      Dialog = new ProgressDialog(Preferences.this); 
      Dialog.setMessage("Please wait..."); 
      Dialog.setCanceledOnTouchOutside(true); 
      Dialog.setCancelable(true); 
      Dialog.show(); 

      new CbSelection().execute(preference); 
      return true; 
     } 
}); 
private class CbSelection extends AsyncTask<Preference, Boolean, Void> { 

      @Override 
      protected Void doInBackground(Preference... pref) { 
       PreferenceScreen screen = (PreferenceScreen)getPreferenceScreen().getRootAdapter().getItem(2); 

       Preference preference = pref[0]; 
       if(preference.getKey().compareTo("select_all") == 0){ 
        publishProgress(true); 
       } 
       return null; 
      } 

      @Override 
      protected void onProgressUpdate(Boolean... ok) { 
       if(ok[0]== true) { 
        PreferenceScreen screen = (PreferenceScreen)getPreferenceScreen().getRootAdapter().getItem(2); 
        for(int i = 0; i < screen.getPreferenceCount(); ++i) { 
         /* select or deselect all checkboxes here... */ 
        } 

       } 
      } 

      @Override 
      protected void onPostExecute(Void v) { 
       Dialog.dismiss(); 
      } 
} 
+0

仍然一樣... ProgressDialog在處理完成時顯示。 – AndroidNewbie 2011-02-13 13:21:36

相關問題