Показать ProgressDialog В Android
У меня есть EditText, который принимает строку от пользователя и кнопку поиска. Когда кнопка поиска нажата, она будет искать через XML-файл и отображать его в ListView.
Я могу принимать входные данные от пользователя, искать через XML-файл и отображать usersearched значение в ListView также.
Я хочу, чтобы отобразить ProgressDialog
после нажатия кнопки поиска, как "Пожалуйста, подождите...ИЗВЛЕЧЕНИЕ ДАННЫХ..."или что-то в этом роде и уволить его когда данные будут показаны.
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();
}
});
}
5 ответов:
объявите свой диалог прогресса:
ProgressDialog progress;
когда вы будете готовы начать диалог прогресса:
progress = ProgressDialog.show(this, "dialog title", "dialog message", true);
и чтобы заставить его уйти, когда вы закончите:
progress.dismiss();
вот небольшой пример потока для вас:
// 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();
Я использую следующий код в одном из моих текущих проектов, где мне скачать данные из интернета. Это все внутри моего класса активности.
// ---------------------------- 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; } }
при создании объекта для панели прогресса проверьте следующее.
это не удается:
dialog = new ProgressDialog(getApplicationContext());
при добавлении контекст деятельности работает..
dialog = new ProgressDialog(MainActivity.this);
вы не должны выполнять ресурсоемкие задачи в основном потоке. Это сделает пользовательский интерфейс не отвечает, и вы получите ANR. Похоже, вы будете делать ресурсоемкие вещи и хотите, чтобы пользователь видел
ProgressDialog
. Вы можете взглянуть на http://developer.android.com/reference/android/os/AsyncTask.html для выполнения ресурсоемких задач. Он также показывает вам, как использоватьProgressDialog
.
Я использую следующий код в одном из моих текущих проектов, где мне скачать данные из интернета. Это все внутри моего класса активности.
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(); } } }
и выполнить его в методе OnCreate как
new GetData().execute();
где календарь - это мой calendarActivity, и я также создал CalendarAdapter, чтобы установить эти значения в виде списка.