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