5

我试图在加载自定义 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);            
        }
    }

我的布局中的 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" />
4

4 回答 4

5

您需要设置gone的默认可见性。progressBar设置onPreExecute()Visible并onPostExecute()设置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" />

你的活动应该是这样的

public class demo extends Activity{
    private ListView listViewGameResults;   
        protected View dialogLayout;
        protected ArrayList<Game> listGames;
    progressBar progress;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.adresults);
            progress=(ProgressBar)findViewByid(R.id.progressbar_loading);
            GameResultsLoader gameResultsLoader = new GameResultsLoader(this);              
            gameResultsLoader.execute();        
        }
    }

使用一个单独的类AsyncTask

public class GameResultsLoader extends AsyncTask<Void, Void, Void> {       
        private GameResultsAdapter adapter;
        Demo demo;
        public GameResultsLoader(Demo demo) {   
        this.demo=demo;         
        }

        @Override
        protected void onPreExecute() { 
        demo.progress.setvisibility(View.Visible);
        }

        @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);
            demo.progress.setVisibility(View.GONE);            
        }
    }
于 2012-09-05T11:34:59.587 回答
2

如果您使用的是在主线程上工作的 asnkTask,那么应用程序的负载会更大。所以更好的解决方案是使用 Service.class。 下载此示例检查此链接所有解决方案都在那里并下载它:您还必须从重新启动此应用程序中获取列表。 https://github.com/PankajSavaliyaGit/Upload-List

于 2016-02-16T10:19:43.867 回答
0

您必须编写代码以在 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();
}
于 2012-09-05T11:27:39.940 回答
0

您可以做的第一件事是将进度条码放在OnCreate方法之后。但最好的办法是为进度条创建一个简单的方法,并且只在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();

当数据准备好查看时,您可以使用以下命令停止 Progress:

progressDialog.dismiss();

我希望这是有帮助的。

于 2018-06-06T18:50:12.520 回答