我正在尝试在加载自定义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" />
答案 0 :(得分:5)
您需要设置progressBar
已消失的默认可见性。onPreExecute()
设置为Visible,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" />
你的活动应该是这样的
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);
}
}
答案 1 :(得分:1)
如果您使用asnkTask在主线程上工作,那么应用程序的负载就更多了。所以更好的解决方案是使用Service.class。 下载这个例子检查此链接所有解决方案都在那里并下载它: 您还必须从重新启动此应用程序获取列表。 https://github.com/PankajSavaliyaGit/Upload-List
答案 2 :(得分: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();
}
答案 3 :(得分:0)
您可以做的第一件事是在OnCreate
方法之后放置进度条形码。但最好的方法是为Progress bar创建一个简单的方法,并且只在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();
我希望这会有所帮助。