Mostrar ProgressDialog Android

Tengo un EditText que toma un String del usuario y un searchButton. Cuando se hace clic en searchButton, buscará en el archivo XML y lo mostrará en ListView.

Puedo tomar la información del usuario, buscar a través del archivo XML y mostrar el valor buscado por el usuario también en ListView.

Lo que quiero es mostrar un ProgressDialog después de hacer clic en searchButton como “POR FAVOR, ESPERE … RECUPERAR DATOS …” o algo así y descartarlo cuando se muestren los datos.

 public class Tab1Activity extends ListActivity { private Button okButton; private Button searchButton; Toast toast; String xml; private TextView searchText; private String searchTextString; HashMap o; ArrayList<HashMap> mylist = new ArrayList<HashMap>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab1); searchButton = (Button) findViewById(R.id.search_button); searchButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub System.out.print("hello"); searchText = (TextView) findViewById(R.id.search_text); searchTextString = searchText.getText().toString(); readXml(searchTextString); } }); } private void readXml(String searchTextString1) { ArrayList<HashMap> mylist = new ArrayList<HashMap>(); String xml = XMLfunctions.getXML(); //Here XMLfunctions is class name which parse xml Document doc = XMLfunctions.XMLfromString(xml); int numResults = XMLfunctions.numResults(doc); if ((numResults <= 0)) { Toast.makeText(Tab1Activity.this, "Testing xmlparser", Toast.LENGTH_LONG).show(); finish(); } NodeList nodes = doc.getElementsByTagName("result"); for (int i = 0; i < nodes.getLength(); i++) { HashMap map = new HashMap(); Element e = (Element) nodes.item(i); String nameMapString = XMLfunctions.getValue(e, "name"); if ( nameMapString.toLowerCase().indexOf(searchTextString1.toLowerCase()) != -1 ) // != -1 means string is present in the search string { map.put("id", XMLfunctions.getValue(e, "id")); map.put("name", XMLfunctions.getValue(e, "name")); map.put("Score", XMLfunctions.getValue(e, "score")); mylist.add(map); } } ListAdapter adapter = new SimpleAdapter(this, mylist, R.layout.parsexml, new String[] { "name", "Score" }, 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 o = (HashMap) lv .getItemAtPosition(position); Toast.makeText(Tab1Activity.this, "Name "+o.get("name")+" Clicked", Toast.LENGTH_LONG) .show(); } }); } 

Declara tu diálogo de progreso:

 ProgressDialog progress; 

Cuando esté listo para comenzar el diálogo de progreso:

 progress = ProgressDialog.show(this, "dialog title", "dialog message", true); 

y hacer que desaparezca cuando hayas terminado:

 progress.dismiss(); 

Aquí hay un pequeño ejemplo de hilo para ti:

 // Note: declare ProgressDialog progress as a field in your class. progress = ProgressDialog.show(this, "dialog title", "dialog message", true); new Thread(new Runnable() { @Override public void run() { // do the thing that takes a long time runOnUiThread(new Runnable() { @Override public void run() { progress.dismiss(); } }); } }).start(); 

Estoy usando el siguiente código en uno de mis proyectos actuales donde descargo datos de Internet. Todo está dentro de mi clase de actividad.

 // ---------------------------- START DownloadFileAsync // -----------------------// class DownloadFileAsync extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); // DIALOG_DOWNLOAD_PROGRESS is defined as 0 at start of class showDialog(DIALOG_DOWNLOAD_PROGRESS); } @Override protected String doInBackground(String... urls) { try { String xmlUrl = urls[0]; URL u = new URL(xmlUrl); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); int lengthOfFile = c.getContentLength(); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; long total = 0; while ((len1 = in.read(buffer)) > 0) { total += len1; // total = total + len1 publishProgress("" + (int) ((total * 100) / lengthOfFile)); xmlContent += buffer; } } catch (Exception e) { Log.d("Downloader", e.getMessage()); } return null; } protected void onProgressUpdate(String... progress) { Log.d("ANDRO_ASYNC", progress[0]); mProgressDialog.setProgress(Integer.parseInt(progress[0])); } @Override protected void onPostExecute(String unused) { dismissDialog(DIALOG_DOWNLOAD_PROGRESS); } } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_DOWNLOAD_PROGRESS: mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Retrieving latest announcements..."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); mProgressDialog.show(); return mProgressDialog; default: return null; } } 

Mientras crea el objeto para la barra de progreso, compruebe lo siguiente.

Esto falla:

 dialog = new ProgressDialog(getApplicationContext()); 

Al agregar el contexto de las actividades funciona …

 dialog = new ProgressDialog(MainActivity.this); 

No debe ejecutar tareas intensivas en recursos en el hilo principal. Hará que la IU no responda y obtendrá un ANR. Parece que va a hacer un uso intensivo de recursos y quiere que el usuario vea el ProgressDialog . Puede echar un vistazo a http://developer.android.com/reference/android/os/AsyncTask.html para realizar tareas intensivas en recursos. También le muestra cómo usar un ProgressDialog .

Estoy usando el siguiente código en uno de mis proyectos actuales donde descargo datos de Internet. Todo está dentro de mi clase de actividad.

 private class GetData extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = ProgressDialog.show(Calendar.this, "", ""); } @Override protected JSONObject doInBackground(String... params) { String response; try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); HttpResponse responce = httpclient.execute(httppost); HttpEntity httpEntity = responce.getEntity(); response = EntityUtils.toString(httpEntity); Log.d("response is", response); return new JSONObject(response); } catch (Exception ex) { ex.printStackTrace(); } return null; } @Override protected void onPostExecute(JSONObject result) { super.onPostExecute(result); progressDialog.dismiss(); if(result != null) { try { JSONObject jobj = result.getJSONObject("result"); String status = jobj.getString("status"); if(status.equals("true")) { JSONArray array = jobj.getJSONArray("data"); for(int x = 0; x < array.length(); x++) { HashMap map = new HashMap(); map.put("name", array.getJSONObject(x).getString("name")); map.put("date", array.getJSONObject(x).getString("date")); map.put("description", array.getJSONObject(x).getString("description")); list.add(map); } CalendarAdapter adapter = new CalendarAdapter(Calendar.this, list); list_of_calendar.setAdapter(adapter); } } catch (Exception e) { e.printStackTrace(); } } else { Toast.makeText(Calendar.this, "Network Problem", Toast.LENGTH_LONG).show(); } } } 

y ejecutarlo en el método OnCreate como el new GetData().execute();

donde Calendar es mi calendarActivity y también he creado un CalendarAdapter para establecer estos valores en una vista de lista.