Showing progress bar while loading a List
Solution 1
Use AsyncTask
to load data in background while showing loading indicator. In AsyncTask's
doInBackground
method , process the JSON or anything which is taking time.
public class HeavyWorker extends AsyncTask < String , Context , Void > {
private ProgressDialog progressDialog ;
private Context targetCtx ;
public HeavyWorker ( Context context ) {
this.targetCtx = context ;
this.needToShow = true;
progressDialog = new ProgressDialog ( targetCtx ) ;
progressDialog.setCancelable ( false ) ;
progressDialog.setMessage ( "Retrieving data..." ) ;
progressDialog.setTitle ( "Please wait" ) ;
progressDialog.setIndeterminate ( true ) ;
}
@ Override
protected void onPreExecute ( ) {
progressDialog.show ( ) ;
}
@ Override
protected Void doInBackground ( String ... params ) {
// Do Your WORK here
return null ;
}
@ Override
protected void onPostExecute ( Void result ) {
if(progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss ( ) ;
}
}
}
In your Activity's onCreate()
execute AsyncTask
new HeavyWorker().execute();
Solution 2
For this type of operations, you should use AsyncTask
with that you can show progress dialog , while it loads.
The official tutorial is pretty helpful. Look into the onPostExecute()
method to figure out how to end any sort of progress bar you may have.
Hope it helps
Solution 3
You should do it with an AsyncTask and show a progress dialog in the onPreExecuteMethod and dismiss it on onPostExecute:
class MyAsyncTask extends AsyncTask<String,Void,Object> {
ProgressDialog pd;
Context context;
public MyAsyncTask(Context c) {
context = c;
}
@Override
protected void onPreExecute() {
pd = ProgressDialog.show(context, "Loading", "Wait", true, true);
pd.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
finish();
}
});
}
@Override
protected Object doInBackground(String... params) {
return null;
}
@Override
protected void onPostExecute(Object result) {
if(pd.isShowing())
pd.dismiss();
}
}
Solution 4
maybe it will help. I use BroadcastReceiver to update ListView in my app.
public static final String UPDATE_HISTORY_LIST = "com.myapp.update_history_list";
onPostExecute AsyncTask
@Override
protected void onPostExecute(JSONObject par) {
Intent intent = new Intent(AppSettings.UPDATE_HISTORY_LIST);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
}
Receiver in Activity
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "Action: " + intent.getAction());
if (AppSettings.UPDATE_HISTORY_LIST.equals(intent.getAction())) {
OrderHistoryFragment history = (OrderHistoryFragment)getFragmentManager().findFragmentByTag("history");
if(history != null && history.isVisible()){
history.refresh();
}
}
}
};
@Override
protected void onPause() {
Log.i(TAG, "onPause");
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onPause();
}
@Override
protected void onResume() {
Log.i(TAG, "onResume");
super.onResume();
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
IntentFilter filter = new IntentFilter();
filter.addAction(AppSettings.UPDATE_HISTORY_LIST);
lbm.registerReceiver(mMessageReceiver, filter);
}
Layout
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
<ProgressBar
android:id="@android:id/progress"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:indeterminate="true" />
Activity
mList = (ListView)rootView.findViewById(R.id.listView1);
mList.setEmptyView(rootView.findViewById(android.R.id.progress));
Sunny
I love coding in Java, python, node, and. Professionally I am an App Developer. Flutter is the new <3 Currently working in blockchain.
Updated on June 04, 2022Comments
-
Sunny almost 2 years
Ok Now i admit that i am new to using progress bar infact i never use it but now i need to use it I have an activity (Main) and a menu which can start 6 new activity. From these activities there is an activity which load the data in a ListView it take 3-4 second to load .This activity parse the json and pass the data to another activity. How can i show the progress bar as soon as user click the menu option for this activity and disappear it when List will be loaded.
Here is the activiy
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Intent intent=new Intent(this ,GetLatAndLng.class); setContentView(R.layout.listplaceholder); //ProgressBar pb=(ProgressBar)findViewById(R.id.progressbar); LocationManager locationManager; String context=Context.LOCATION_SERVICE; locationManager=(LocationManager)getSystemService(context); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String provider = locationManager.getBestProvider(criteria, true); Location location = locationManager.getLastKnownLocation(provider); final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { updateWithNewLocation(location); } public void onProviderDisabled(String provider){ updateWithNewLocation(null); } public void onProviderEnabled(String provider){ } public void onStatusChanged(String provider, int status, Bundle extras){ } }; updateWithNewLocation(location); locationManager.requestLocationUpdates(provider, 2000, 10, locationListener); double geoLat = location.getLatitute(); double geoLng = location.getLongitude(); Bundle b=new Bundle(); //pb.setVisibility(View.VISIBLE); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); JSONObject json = JSONFunction.getJSONfromURL(getUrl()); Log.v(TAG, "got the json"); try{ JSONArray JArray = json.getJSONArray("results"); Log.v(TAG, "getting results"); for(int i=0;i<JArray.length();i++){ HashMap<String, String> map = new HashMap<String, String>(); JSONObject e = JArray.getJSONObject(i); JSONObject location1=e.getJSONObject("geometry").getJSONObject("location"); latitude[i]=location1.getDouble("lat"); longitude[i]=location1.getDouble("lng"); reference[i]=e.getString("reference"); Log.v(TAG, reference[i]); distance[i]=GetLatAndLng.gps2m(geoLat, geoLng,latitude[i] ,longitude[i]); map.put("id", String.valueOf(i)); map.put("name", "" + e.getString("name")); map.put("vicinity", "Address " + e.getString("vicinity")+" "+"Disance:"+distance[i]); mylist.add(map); } }catch(JSONException e) { Log.e("log_tag", "Error parsing data "+e.toString()); } // pb.setVisibility(View.GONE); b.putStringArray("key", reference); intent.putExtras(b); Log.v(TAG, ""+reference); ListAdapter adapter = new SimpleAdapter(this, mylist , R.layout.listview, new String[] { "name", "vicinity", }, new int[] { R.id.item_title, R.id.item_subtitle }); setListAdapter(adapter); final ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position); Toast.makeText(JsonExampleActivity.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); intent.putExtra("clickedid",position); startActivity(intent); } }); } public void updateWithNewLocation(Location location2) { if(location2!=null) { double geoLat = location2.getLatitude(); double geoLng = location2.getLongitude(); } }
Thanks in Advance!!
-
Sunny over 12 yearsok i admit that i need asynkTask but can i pass data from asynkTask class to another activity? as i pass above.
-
Udaykiran over 12 yearsYes you can, in onPostExecute method, you can work UI operations and can pass the data to the other activity..
-
AndreKR over 7 yearsThis causes
java.lang.IllegalArgumentException: View not attached to window manager
on theprogressDialog.dismiss ( )
line when screen orientation changes while the dialog is shown.