Mostrar ProgressDialog Android

78

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 información del usuario, buscar en el archivo XML y mostrar el valor buscado por el usuario en ListView también.

Lo que quiero es mostrar un ProgressDialogdespués de hacer clic en el botón de búsqueda como "POR FAVOR ESPERE ... RECUPERANDO 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<String, String> o;
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

@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<String, String>> mylist = new ArrayList<HashMap<String, String>>();

    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<String, String> map = new HashMap<String, String>();

        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<String, String> o = (HashMap<String, String>) lv
                    .getItemAtPosition(position);


                Toast.makeText(Tab1Activity.this,
                         "Name "+o.get("name")+"  Clicked", Toast.LENGTH_LONG)
                        .show();                

        }
    });
}
captaindroid
fuente
2
ProgressDialog ha quedado obsoleto desde API Level O developer.android.com/reference/android/app/ProgressDialog.html
Varvara Kalinina
2
Dice "Use un indicador de progreso como ProgressBar en línea dentro de una actividad en lugar de usar este diálogo modal". ¿Por qué no nos muestran simplemente cómo hacerlo? :)
Wolf359

Respuestas:

265

Declare su diálogo de progreso:

ProgressDialog progress;

Cuando esté listo para iniciar el cuadro de 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();
dldnh
fuente
He escrito el siguiente código pero no funciona: 'searchButton.setOnClickListener (new View.OnClickListener () {public void onClick (View v) {// TODO Método generado automáticamente stub System.out.print ("hola"); searchText = (TextView) findViewById (R.id.search_text); searchTextString = searchText.getText (). ToString (); progress.show (Tab1Activity.this, "Título del cuadro de diálogo", "Espere ... cargando"); readXml (searchTextString ); progress.dismiss ();}}); '
captaindroid
nup, lleva muy poco tiempo, como puede ver arriba, también he escrito el método readXML.
captaindroid
Me pregunto si readXML se ejecuta tan rápido que no ve el cuadro de diálogo de progreso. si estuviera haciendo algo a través de la red que realmente tomara un par de segundos, bueno, en primer lugar, lo haría en un hilo separado, pero luego verá el efecto completo del cuadro de diálogo de progreso. Si termina agregando hilos, asegúrese de que usted showy dismissel diálogo de progreso en el hilo de la IU.
dldnh
Pero creo que tiene tiempo suficiente para mostrar progressDialog. Cuando hago clic en el botón de búsqueda, tarda unos 2-3 segundos aproximadamente.
captaindroid
¿Sabes qué? Probablemente se deba a que readXMLno permite que la interfaz de usuario recupere el aliento. es posible que desee ponerlo en su propio hilo, ya sea con simple new Thread(...)(que prefiero) o con AsyncTask, como sugiere Win Myo Htet.
dldnh
7

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

// ---------------------------- START DownloadFileAsync // -----------------------//
class DownloadFileAsync extends AsyncTask<String, String, String> {

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

}
the_gesslar
fuente
La orientación cambió muy bien para mí. Acabo de probar en un AVD 2.3.3 y en mi teléfono ICS.
the_gesslar
6

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

Esto falla:

dialog = new ProgressDialog(getApplicationContext());

Mientras se agrega el contexto de actividades funciona.

dialog = new ProgressDialog(MainActivity.this);
amalBit
fuente
2

No debe ejecutar tareas que consuman muchos recursos en el hilo principal. Hará que la interfaz de usuario no responda y obtendrá un ANR. Parece que estará haciendo cosas que requieren muchos recursos y desea que el usuario vea el archivo ProgressDialog. Puede echar un vistazo a http://developer.android.com/reference/android/os/AsyncTask.html para realizar tareas que requieren muchos recursos. También le muestra cómo usar un ProgressDialog.

Gana Myo Htet
fuente
1

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

private class GetData extends AsyncTask<String, Void, JSONObject> {

        @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<String, String> map = new HashMap<String, String>();

                            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 new GetData().execute();

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

AndroidGeek
fuente