Android 加载ListView时的ProgressBar(使用AsyncTask)
我试图在加载自定义ListView时显示进度条,然后将其隐藏。 我使用的是异步任务,但出于某些原因-未设置内容视图,并且在加载所有列表视图之前,上一个布局视图一直处于停滞状态 这是我的密码:Android 加载ListView时的ProgressBar(使用AsyncTask),android,android-layout,android-ui,Android,Android Layout,Android Ui,我试图在加载自定义ListView时显示进度条,然后将其隐藏。 我使用的是异步任务,但出于某些原因-未设置内容视图,并且在加载所有列表视图之前,上一个布局视图一直处于停滞状态 这是我的密码: private ListView listViewGameResults; protected View dialogLayout; protected ArrayList<Game> listGames; @Override public void on
private ListView listViewGameResults;
protected View dialogLayout;
protected ArrayList<Game> listGames;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.adresults);
GameResultsLoader gameResultsLoader = new GameResultsLoader();
gameResultsLoader.execute();
}
private class GameResultsLoader extends AsyncTask<Void, Void, Void> {
private GameResultsAdapter adapter;
public GameResultsLoader() {
}
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(Void... params) {
try {
listGames = GameResultsCache.getInstance().getGameResults();
adapter = new GameResultsAdapter(getBaseContext(), listGames);
listViewGameResults = (ListView)findViewById(R.id.listViewGameResults);
}
catch (Exception e) {
// TODO Auto-generated catch block
finish();
}
return null;
}
@Override
protected void onPostExecute(Void res) {
listViewGameResults.setAdapter(adapter);
listViewGameResults.setDivider(null);
listViewGameResults.setDividerHeight(0);
ProgressBar pb = (ProgressBar)findViewById(R.id.progressbar_loading);
pb.setVisibility(View.GONE);
}
}
私有ListView listViewGameResults;
保护视图对话框布局;
受保护的ArrayList列表游戏;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.adresults);
GameResultsLoader GameResultsLoader=新GameResultsLoader();
gameResultsLoader.execute();
}
私有类GameResultsLoader扩展异步任务{
私有游戏结果适配器;
公共游戏结果加载器(){
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的Void doInBackground(Void…params){
试一试{
listGames=GameResultCache.getInstance().getGameResults();
adapter=新游戏结果适配器(getBaseContext(),listGames);
listViewGameResults=(ListView)findViewById(R.id.listViewGameResults);
}
捕获(例外e){
//TODO自动生成的捕捉块
完成();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void res){
listViewGameResults.setAdapter(适配器);
listViewGameResults.setDivider(空);
listViewGameResults.setDividerHeight(0);
ProgressBar pb=(ProgressBar)findViewById(R.id.ProgressBar\u加载);
pb.setVisibility(View.GONE);
}
}
我的布局中的ProgressBar和ListView:
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_centerInParent="true"
android:id="@+id/progressbar_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/listViewGameResults"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="1dip"
android:layout_below="@+id/upperstrip"
android:layout_above="@+id/ivDownStrip" />
您必须编写代码,以在preExecute方法中启动progressDialog,并在postExecute时将其关闭
@Override
protected void onPreExecute() {
proDialog = new ProgressDialog(context);
proDialog.setTitle("App name");
proDialog.setMessage("Loding...");
proDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
//proDialog.setIcon(R.drawable.)
proDialog.setCancelable(true);
proDialog.show();
}
@Override
protected void onPostExecute(Void res) {
proDialog.dismiss();
}
您需要设置
progressBar
gone.andonPreExecute()
set Visible和onPostExecute()
set gone的默认可见性
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_centerInParent="true"
android:id="@+id/progressbar_loading"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ListView
android:id="@+id/listViewGameResults"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginTop="1dip"
android:layout_below="@+id/upperstrip"
android:layout_above="@+id/ivDownStrip" />
若您使用的asnkTask是在主线程上工作的,那个么应用程序的负载会大得多。所以更好的解决方案是使用Service.class。 下载此示例检查此链接是否存在所有解决方案并下载: 您还必须从重新启动此应用程序中获取列表。
您可以做的第一件事是将进度条形码放在创建方法之后。但最好是为进度条创建一个简单的方法,并且只在
OnCreate
方法中调用它
以下代码对我来说很好:
private void showDialog() {
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("Have a nice time");
progressDialog.setMessage("Please wait while showing Titles :) ");
progressDialog.setCancelable(true);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.show();
}
然后在OnCreate
showDialog();
当数据准备好查看时,可以使用以下方法停止进度:
progressDialog.dismiss();
我希望这是有帮助的 我不想要进度对话框。我想要一个没有消息的进度条。更改以下代码:mProgressDialog.setProgressStyle(ProgressDialog.STYLE\u水平);并在progressUpdate中为进度条设置值。但在执行setContentView时,进度条已在运行。看看我的xml。我只需要把它藏起来。这不是一个进度对话。我的问题是内容视图没有显示。问题不在于ProgressBar。问题是在设置内容视图时,它没有设置,而是等待整个listview加载。这就是为什么我说,您需要在AsyncTask的后台使用AsyncTask加载整个listview。在Oncreate()上使用setContextView。这就是我要做的。我在“OnCreate”方法中设置内容视图,然后在AsyncTask的“doInBackground”中加载listview。不要添加链接作为答案,请提供一些关于问题本身的代码示例。
showDialog();
progressDialog.dismiss();