Showing progress bar while loading a List

11,954

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));
Share:
11,954
Sunny
Author by

Sunny

I love coding in Java, python, node, and. Professionally I am an App Developer. Flutter is the new &lt;3 Currently working in blockchain.

Updated on June 04, 2022

Comments

  • Sunny
    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
    Sunny over 12 years
    ok i admit that i need asynkTask but can i pass data from asynkTask class to another activity? as i pass above.
  • Udaykiran
    Udaykiran over 12 years
    Yes you can, in onPostExecute method, you can work UI operations and can pass the data to the other activity..
  • AndreKR
    AndreKR over 7 years
    This causes java.lang.IllegalArgumentException: View not attached to window manager on the progressDialog.dismiss ( ) line when screen orientation changes while the dialog is shown.