0

私のアプリでは、大量のデータを管理し、それらをリストビューで表示しています。データが多いのですがActivityのオープニングの一部のデバイスが遅いのではないかと思います... データを表示する前にロードするための進捗ダイアログを追加したいと思います。これの例はありますか?

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);
4

2 に答える 2

0

または、 CursorLoader: Loading Data in the Backgroundを使用すると、データが変更されたときにデータをリロードできます。

バックグラウンド タスクの実行中に進行状況を表示する 1 つの方法は、AsyncTask を使用することです。もう 1 つの方法は、アプリの最初の起動時に非表示 (android:visibility="gone") で始まる ProgressBar ウィジェットを使用することです。データの読み込みを開始するときは、可視 ((android:visibility="visible") に設定します。データの読み込みが終了したら、「消えた」に戻します。「消えた」は「見えない」よりも優れています。" 「非表示」はウィジェットを表示しませんが、ウィジェットが占有するスペースを表示します。

于 2013-09-27T00:22:36.613 に答える
0

AsyncTasks http://developer.android.com/reference/android/os/AsyncTask.htmlを検索しています

それは非常に簡単です。スーパークラスとして AsyncTask を使用してクラスを実装し、3 つのメソッドをオーバーライドします。

-onPreExecute()メソッドは、ProgressDialog

-doInBackground(Context... arg0)メソッドは、データベースからデータを収集します。

-onPostExecute(String result)メソッドは、データをリストに入れ、ProgressDialog

コードでは、メソッドを 2 つに分割する必要があります。最初のメソッド ( と呼びましょうgetData()) からdb.close();2 番目のメソッドまで (たとえば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);
}
}

両方のメソッドで必要な変数をメソッドの外に置きます。

于 2013-09-26T21:54:36.837 に答える