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,emptyview 就会消失。您可以将 Progressbar 传递给您的案例中的 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 回答