2013-09-26 34 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”)。当数据加载完成时,您将其设置回“已离开”。“已离开”优于“不可见”,因为“如果它不是布局的一部分,“不可见”不会显示小部件,但会显示小部件占用的空间。