2

リストビューがあり、項目を動的にロードしています。問題は、そのアクティビティをアクティブにするときです。時間がかかりすぎるため、UI の読み込み中に進行状況ダイアログを表示する必要があります。doInBackground (非同期タスクを使用している場合) では、開発者が UI をいじることができないため、その方法が本当にわかりません。私は何をすべきか ?

これが私のUIロードコードです:

LeagueTableRow leagueTableRow_data[] = new LeagueTableRow[]
                    {
                        new LeagueTableRow(1,R.drawable.logo,"aaa",12,9,3,14),
                        new LeagueTableRow(3,R.drawable.logo,"aaa",12,9,3,14),
                        new LeagueTableRow(4,R.drawable.logo,"aaa",12,9,3,14),
                        new LeagueTableRow(5,R.drawable.logo,"aaa",12,9,3,14),
                            new LeagueTableRow(2,R.drawable.logo,"aaa",12,9,3,14)
                    };

                    LeagueTableRowAdapter adapter = new LeagueTableRowAdapter(context, 
                            R.layout.leaguetablecontent, leagueTableRow_data);


                    listViewLeagueTable = (ListView)findViewById(R.id.listViewLeagueTable);

                    View header = (View)getLayoutInflater().inflate(R.layout.leaguetableheader, null);
                    listViewLeagueTable.addHeaderView(header);

                    listViewLeagueTable.setAdapter(adapter);
4

3 に答える 3

3

これは、 AsyncTask (インテリジェントなバックラウンド スレッド) とProgressDialogの助けを借りて実現できます。

AsyncTask が開始されると不確定な状態の ProgressDialog が発生し、タスクが終了するとダイアログは閉じられます。

サンプルコード

この例でアダプターが何をするかは重要ではありませんが、進行状況を示すダイアログを表示するには AsyncTask を使用する必要があることを理解することがより重要です。

private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > {
    ProgressDialog dialog;
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(viewContacts.this);
        dialog.setMessage(getString(R.string.please_wait_while_loading));
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();
    }
    /* (non-Javadoc)
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected ContactsListCursorAdapter doInBackground(Void... params) {
        cur1 = objItem.getContacts();
        startManagingCursor(cur1);

        adapter1 = new ContactsListCursorAdapter (viewContacts.this,
                R.layout.contact_for_listitem, cur1, new String[] {}, new int[] {});

        return adapter1;
    }

    protected void onPostExecute(ContactsListCursorAdapter result) {
        list.setAdapter(result);
        dialog.dismiss();
    }
}
于 2012-08-13T06:51:46.940 に答える
2

listView.setEmptyView を使用して空のビューを設定した場合。リストでsetadapterを実行するまで、ビューはリストの代わりに表示されます。そのため、 setAdapter を実行するとすぐに空のビューが消えます。プログレスバーを表示するには、プログレスバーを setEmptyview に渡すことができます。

編集:
Asynctask の OnPostExecute でSetadapterを使用します。OnPostExecute、OnPreExecute、OnProgressUpdate、OnCancelled はすべて UI スレッドで実行されます。それでも ProgressDialog を主張する場合は、OnPreExecute でダイアログを作成し、Asynctask の OnpostExecute と OnCancelled でそれを閉じます。

于 2012-08-13T06:44:36.557 に答える
0

リストの読み込みに時間がかかりすぎる場合は、 AsyncTaskを使用してください。リスト ビューの上部にプログレス バーを配置して、AsyncTask でそれを使用します。

于 2012-08-13T06:41:18.430 に答える