Android 如何在加载UI项时显示ProgressDialog?

Android 如何在加载UI项时显示ProgressDialog?,android,android-layout,android-listview,Android,Android Layout,Android Listview,我有一个listview,我正在动态地将项目加载到其中。 问题是当我激活那个活动时。它花费的时间太长,所以我必须在加载UI时显示一些进度对话框。 我真的不知道怎么做,因为doInBackground(如果使用异步任务)不允许开发人员干扰UI。 我该怎么办 以下是我的UI加载代码: LeagueTableRow leagueTableRow_data[] = new LeagueTableRow[] { new

我有一个listview,我正在动态地将项目加载到其中。 问题是当我激活那个活动时。它花费的时间太长,所以我必须在加载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);

如果加载列表花费太多时间,请使用。在列表视图顶部放置一个进度条,在AsyncTask中使用该进度条。如果您使用设置emptyview,希望这将对您有所帮助。视图将显示在列表的位置,直到您对列表执行setadapter操作。因此,一旦设置适配器,空视图就会消失。您可以将Progressbar传递给案例中的setEmptyview以显示Progressbar

编辑:
在异步任务中使用Setadapter。
OnPostExecute、OnPreExecute、OnProgressUpdate、OnCancelled都在UI线程上运行。如果您仍然坚持使用ProgressDialog,请在OnPreExecute中创建对话框,并在OnpostExecute和OnCancelled中取消它,这可以通过(智能回退线程)和

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();
    }
}
private类PrepareAdapter1扩展异步任务{
进程对话;
@凌驾
受保护的void onPreExecute(){
dialog=新建ProgressDialog(viewContacts.this);
setMessage(getString(R.string.please_wait_,while_loading));
对话框。setUndeterminate(true);
对话框。可设置可取消(false);
dialog.show();
}
/*(非Javadoc)
*@see android.os.AsyncTask#doInBackground(Params[])
*/
@凌驾
受保护的联系人列表光标或适配器doInBackground(无效…参数){
cur1=objItem.getContacts();
开始管理光标(cur1);
adapter1=新联系人列表光标或适配器(viewContacts.this,
R.layout.contact_for_listitem,cur1,新字符串[]{},新int[]{});
返回适配器1;
}
PostExecute上受保护的void(ContactsListCursorAdapter结果){
list.setAdapter(结果);
dialog.dismise();
}
}

我认为您应该使用延迟加载。将适配器的代码放在这里。activity获得了一个名为runOnUIThread的方法。我应该将“setAdapter”放在什么方法中?