使用AsyncTask加载ListView时显示进度条

5

我正在尝试在加载自定义ListView时显示进度条,然后隐藏它。 我正在使用ASync任务,但由于某种原因-内容视图没有设置,并且前一个布局视图一直停留,直到所有列表视图都加载完毕。

这是我的代码:

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个回答

5
你需要设置progressBar的默认可见性为隐藏,onPreExecute()时将其设置为可见状态,onPostExecute()时将其再次隐藏。
<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" />

您的Activity应该像这样

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);            
        }
    }

但是当执行setContentView时,进度条已经在运行了。 看看我的xml文件。 我只需要将它隐藏起来。它不是一个进度对话框。 我的问题是内容视图没有显示出来。 - ohadinho
问题与进度条无关。问题在于设置内容视图时,它不会立即设置并且需要等待整个列表视图加载完成。 - ohadinho
这就是为什么我说,你需要使用AsyncTask在AsyncTask的后台加载整个ListView。在Oncreate()中使用setContextView()。 - Dilip
这就是我正在做的。我在"OnCreate"方法中设置内容视图,然后在AsyncTask的"doInBackground"中加载listview。 - ohadinho

2

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


请将以下与编程有关的内容从英语翻译为中文。仅返回翻译后的文本:不要在答案中添加链接,请在问题本身上提供一些代码示例。 - Phiter

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();

当数据准备好查看时,您可以使用以下方法停止进程:

progressDialog.dismiss();

希望这对你有所帮助。


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();
}

我不想要一个进度对话框。我想要一个没有消息的进度条。 - ohadinho
修改以下代码:mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 并在progressUpdate中为进度条设置值。 - NaserShaikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接