2012-03-22 109 views
76

我有一个EditText从用户和一个searchButton获取一个字符串。 单击searchButton时,它将搜索XML文件并将其显示在ListView中。显示ProgressDialog Android

我能够从用户那里接受输入,搜索XML文件,并在ListView中显示usersearched值。

我想要的是显示一个ProgressDialog后searchButton被点击像“请等待...检索数据...”或类似的东西,并在数据显示时解雇它。

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一直以来API级别Øhttps://developer.android.com/reference/弃用android/app/ProgressDialog.html – 2017-04-25 16:12:23

+1

它说:“在活动内部使用ProgressBar等进度指示器,而不是使用此模式对话框。”他们为什么不简单告诉我们如何去做? :) – MehmetGunacti 2017-04-27 03:29:43

回答

261

声明你的进度对话框:

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

我写下面的代码,但没有工作: 'searchButton。setOnClickListener(新View.OnClickListener(){ \t \t \t公共无效的onClick(视图v){ \t \t \t \t // TODO自动生成方法存根 \t \t \t \t是System.out.print( “你好”) ; \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,“Dialog Title”,“Please wait ... loading”); \t \t \t \t readXml(searchTextString); \t \t \t \t progress.dismiss(); \t \t \t \t \t \t} \t \t});” – captaindroid 2012-03-22 00:40:02

+0

'readXML'需要很长时间吗? – dldnh 2012-03-22 00:42:03

+0

nup,它需要很短的时间,你可以看到上面我也写了readXML方法。 – captaindroid 2012-03-22 00:43:08

1

在主线程,则不应执行资源密集型任务。它会使界面无响应,你会得到一个ANR。看起来你会做资源密集型的东西,并希望用户看到ProgressDialog。你可以看看http://developer.android.com/reference/android/os/AsyncTask.html来完成资源密集型任务。它还会告诉你如何使用ProgressDialog

7

我在当前的项目中使用下面的代码,我从互联网上下载数据。这一切都在我的活动课内。

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

现在尝试更改设备的方向,而AsyncTask执行... – Vladimir 2012-03-22 01:13:02

+0

方向改变对我来说很好。我刚刚在2.3.3 AVD和我的ICS手机上进行了测试。 – 2012-03-22 02:03:33

+0

我该如何实施? – user1708134 2013-03-01 11:19:44

1

我使用在我从互联网上下载的数据我目前的项目之一下面的代码。这一切都在我的活动课内。

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这些值设置为列表视图。

6

在为进度条创建对象时,请检查以下内容。

这种失败:

dialog = new ProgressDialog(getApplicationContext()); 

同时加入了活动的背景下工程..

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

解释在这里:http://www.doubleencore.com/2013/06/context/ :) – 2014-12-22 15:31:48