2012-03-22 14 views
76

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.Mostrar ProgressDialog Android

Soy capaz de recibir comentarios 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 el botón de búsqueda 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<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();     

     } 
    }); 
} 
+1

ProgressDialog es obsoleta desde la API Nivel O https://developer.android.com/reference/ android/app/ProgressDialog.html –

+1

Dice "Usar un indicador de progreso como ProgressBar en línea dentro de una actividad en lugar de usar este cuadro de diálogo modal". ¿Por qué simplemente no nos muestran cómo hacerlo? :) – MehmetGunacti

Respuesta

261

Declarar el diálogo de progreso:

ProgressDialog progress; 

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

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

y para hacer que desaparezca cuando haya terminado:

progress.dismiss(); 

He aquí un pequeño ejemplo de rosca para usted:

// 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(); 
+0

Tengo escribir debajo del código pero no funciona: 'searchButton.setOnClickListener (nueva View.OnClickListener() { \t \t \t public void onClick (Ver v) { \t \t \t \t // TODO Auto generados por el método talón de \t \t \t \t System.out.print ("hola") ; \t \t \t \t searchText = (TextView) findViewById (R.id.search_text);. \t \t \t \t searchTextString = searchText.getText() toString(); \t \t \t \t progress.show (Tab1Activity.this, "Título del cuadro de diálogo", "Espere ... cargando"); \t \t \t \t readXml (searchTextString); \t \t \t \t progress.dismiss(); \t \t \t \t \t \t} \t \t});' – captaindroid

+0

hace el 'readXML' tomar un largo tiempo? – dldnh

+0

nup, tarda muy poco tiempo, como puede ver arriba, también tengo el método readXML de escritura. – captaindroid

1

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

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 actividad.

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

} 
+1

Y ahora intente cambiar la orientación del dispositivo mientras AsyncTask ejecuta ... – Vladimir

+0

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

+0

¿Cómo implemento esto? – user1708134

1

Estoy utilizando 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<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 OnCreate Método como new GetData().execute();

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

6

Al crear el objeto para la barra de progreso, compruebe lo siguiente.

Esta falla:

dialog = new ProgressDialog(getApplicationContext()); 

Mientras que la adición del contexto actividades funciona ..

dialog = new ProgressDialog(MainActivity.this); 
+3

la explicación está aquí: http://www.doubleencore.com/2013/06/context/ :) –

Cuestiones relacionadas