Android 加载ListView时的ProgressBar(使用AsyncTask)

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

我试图在加载自定义ListView时显示进度条,然后将其隐藏。 我使用的是异步任务,但出于某些原因-未设置内容视图,并且在加载所有列表视图之前,上一个布局视图一直处于停滞状态

这是我的密码:

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.and
onPreExecute()
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();