2013-09-26 37 views
0

在我的應用程序中,我管理大量數據,並在listview中查看它們。 數據很多恐怕有些設備在Activity的開啓速度很慢...... 我想添加一個進度對話框來加載顯示之前的數據。 你有這方面的任何例如`Android progressdialog SQLite

private void showDetails(String anno){ 
    SQLiteDatabase db = new BilancioHelper(this).getReadableDatabase(); 
    final List<Dettaglio> dettagli = new ArrayList<Euscite.Dettaglio>(12); 

    for (int i=1; i<=12; i++){ 
     String mese; 
     if (i<10){ 
      mese = "0"+i; 
     } else { 
      mese = ""+i; 
     } 

     String sql = "SELECT _Id,Data,Categoria,Note,Uscita FROM Giornate WHERE uscita>0 AND data LIKE '"+anno+"-"+mese+"%'"; 
     Cursor c = db.rawQuery(sql, null); 

     while (c.moveToNext()){ 
      Dettaglio d = new Dettaglio(); 
      d.id = c.getInt(0); 
      d.data = c.getString(1); 
      d.categorie = (c.getString(2) != null) ? c.getString(2) : ""; 
      d.note = (c.getString(3) != null) ? c.getString(3) : ""; 
      d.uscite = c.getFloat(4); 


      dettagli.add(d); 
     } 
     c.close(); 
    } 

    db.close(); 

    ListAdapter adapter = new ArrayAdapter<Dettaglio>(this, R.layout.dettaglio_row_uscite, R.id.tv_entrata, dettagli){ 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View row = super.getView(position, convertView, parent); 

      Log.v("Bilancio", "Creo elemento in posizione "+position); 


      TextView tvData, tvNote, tvUscite, tvId, tvCategorie; 
      tvData = (TextView) row.findViewById(R.id.tv_data_uscita); 


      tvUscite = (TextView) row.findViewById(R.id.tv_entrata); 
      tvCategorie = (TextView) row.findViewById(R.id.tv_cat_uscite); 
      tvNote = (TextView) row.findViewById(R.id.tv_note_us); 

      tvId = (TextView) row.findViewById(R.id.tv_id_uscite); 

      Dettaglio d = dettagli.get(position); 
      tvData.setText(d.data+""); 
      tvNote.setText(d.note+""); 
      tvCategorie.setText(d.categorie+""); 

      Double value = Double.valueOf(d.uscite); 
      NumberFormat formatter = NumberFormat.getCurrencyInstance(); 
      String uscite = formatter.format(value); 
      tvUscite.setText(uscite+""); 

      tvId.setText(d.id+""); 
      return row; 
     } 
    }; 
    lista.setAdapter(adapter); 

回答

0

您正在搜索AsyncTasks http://developer.android.com/reference/android/os/AsyncTask.html

這很簡單:您可以實現用的AsyncTask一類,因爲它的超類,並覆蓋了三種方法:

onPreExecute() - 方法應該表現出ProgressDialog

doInBackground(Context... arg0) - 方法從DAT收集數據凌辱。

onPostExecute(String result) - 方法,將數據輸入列表並關閉ProgressDialog

在你的代碼應該分割你的方法爲兩種:第一個(讓我們稱之爲getData())從開始到db.close();,一切之後在第二個方法(例如showData()

然後你創建一個這樣的活動爲您提供一流的:

protected class LoadDataTask extends AsyncTask<Context, Integer, String> 
{ 
ProgressDialog myLoadingDialog; 

@Override 
protected void onPreExecute() 
{ 
myLoadingDialog = new ProgressDialog(YourActivity.this); 
myLoadingDialog.setMessage("Loading"); 
    myLoadingDialog.setIndeterminate(false); 
    myLoadingDialog.setCancelable(false); 
    myLoadingDialog.show(); 
    super.onPreExecute(); 
} 

@Override 
protected String doInBackground(Context... arg0) 
{ 
    getData(); 
    return null; 
} 

@Override 
protected void onPostExecute(String result) 
{ 
    showData(); 
    myLoadingDialog.dismiss(); 
    super.onPostExecute(result); 
} 
} 

把瓦里這兩種方法都需要這些方法。

+0

AsyncTask as i enter在我的代碼??你能幫助我嗎? –

+0

@AndreaMalini我更新了我的答案 – Day

+0

我進入了課堂,但不知道如何分裂我的代碼,像2說... –

0

或者CursorLoader:Loading Data in the Background,它允許您在數據更改時重新加載數據。

執行後臺任務時顯示進度的一種方法是使用AsyncTask。另一種方法是在應用第一次啓動時使用ProgressBar小部件,該小部件開始隱形(android:visibility =「gone」)。當您啓動數據加載時,您將其設置爲可見((android:visibility =「visible」)。當數據加載完成時,您將其設置回「已離開」。「已離開」優於「不可見」,因爲「如果它不是佈局的一部分,「不可見」不會顯示小部件,但會顯示小部件佔用的空間。