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 ProgressDialog
despué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();
}
});
}
android
multithreading
progressdialog
captaindroid
fuente
fuente
Respuestas:
Declare su diálogo de progreso:
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();
fuente
show
ydismiss
el diálogo de progreso en el hilo de la IU.readXML
no permite que la interfaz de usuario recupere el aliento. es posible que desee ponerlo en su propio hilo, ya sea con simplenew Thread(...)
(que prefiero) o conAsyncTask
, como sugiere Win Myo Htet.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; } }
fuente
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);
fuente
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 unProgressDialog
.fuente
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.
fuente