2013-10-14 73 views
1

我創建了一個從服務器執行數據讀取json的過程。讀完數據後,我希望ProgressDialog在頁面正在讀取時顯示,並在所有數據顯示爲列表視圖時消失。Android ProgressDialog顯示何時檢索數據

我已經放:

ProgressDialog progress = new ProgressDialog(this); 
progress.setMessage("Wait while loading..."); 
progress.show(); 

但總是失敗。

對於這種情況,所有數據已經​​在listview中正確顯示,我只是想用ProgressDialog來幫助顯示數據檢索過程。

我的活動:

package com.joris.moviesmonitoring; 

import java.util.ArrayList; 
import java.util.HashMap; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import com.joris.moviesmonitoring.JSONParser; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

public class MainActivity extends ListActivity { 

     // url to make request 
     private static String url = "http://api.mydomain.info/contacts/"; 

     // JSON Node names 
     private static final String TAG_CONTACTS = "contacts"; 
     private static final String TAG_ID = "id"; 
     private static final String TAG_NAME = "name"; 
     private static final String TAG_EMAIL = "email"; 
     private static final String TAG_PHONE = "phone"; 
     private static final String TAG_PHONE_MOBILE = "mobile"; 

     // contacts JSONArray 
     JSONArray contacts = null; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 


      // Hashmap for ListView 
      ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>(); 

      // Creating JSON Parser instance 
      JSONParser jParser = new JSONParser(); 

      // getting JSON string from URL 
      JSONObject json = jParser.getJSONFromUrl(url); 


      try { 
       // Getting Array of Contacts 
       contacts = json.getJSONArray(TAG_CONTACTS); 

       // looping through All Contacts 
       for(int i = 0; i < contacts.length(); i++){ 
        JSONObject c = contacts.getJSONObject(i); 

        // Storing each json item in variable 
        String id = c.getString(TAG_ID); 
        String name = c.getString(TAG_NAME); 
        String email = c.getString(TAG_EMAIL); 

        // Phone number is agin JSON Object 
        JSONObject phone = c.getJSONObject(TAG_PHONE); 
        String mobile = phone.getString(TAG_PHONE_MOBILE); 

        // creating new HashMap 
        HashMap<String, String> map = new HashMap<String, String>(); 

        // adding each child node to HashMap key => value 
        map.put(TAG_ID, id); 
        map.put(TAG_NAME, name); 
        map.put(TAG_EMAIL, email); 
        map.put(TAG_PHONE_MOBILE, mobile); 

        // adding HashList to ArrayList 
        contactList.add(map); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 



      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      ListAdapter adapter = new SimpleAdapter(this, contactList, 
        R.layout.list_item, 
        new String[] { 
         TAG_NAME, 
         TAG_EMAIL, 
         TAG_PHONE_MOBILE, 
         TAG_PHONE_MOBILE 
        }, new int[] { 
          R.id.name, 
          R.id.email, 
          R.id.mobile, 
          R.id.desc 
        }); 

      setListAdapter(adapter); 


      // selecting single ListView item 
      ListView lv = getListView(); 

      // Launching new screen on Selecting Single ListItem 
      lv.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 
        // getting values from selected ListItem 
        String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
        String cost = ((TextView) view.findViewById(R.id.email)).getText().toString(); 
        String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString(); 


        // Starting new intent 
        Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
        in.putExtra(TAG_NAME, name); 
        in.putExtra(TAG_EMAIL, cost); 
        in.putExtra(TAG_PHONE_MOBILE, description); 
        startActivity(in); 

       } 
      }); 



     } 



} 

我已經試過這樣的:progressDialog in AsyncTask 但結果總是失敗。我很新學習java。

+0

你是什麼意思,它失敗了應用程序崩潰或發生了什麼? – tyczj

+0

不,在數據收集發生時不會出現ProgressDialog .. –

+0

請勿嘗試在'onCreate()'中創建您的整個應用程序。瞭解活動的生命週期。僅在第一次設置'Activity'時使用'onCreate()'。 – Simon

回答

0

它可能沒有出現,因爲數據在對話框有時間被創建之前完成,因此您在對話框出現之前取消了對話框。測試這個不會取消對話框時處理完成,只是讓它離開。如果出現dialg那麼這是你的問題

+0

一旦我擺脫了這一行:progress.dismiss(); 果然,數據與ProgressDialog一起出現。但ProgressDialog在流程開始之前不會出現。在列表視圖中發佈數據之前,頁面爲空白。 ProgressDialog不應該出現在這裏。我怎麼做? –

+0

以及你可以使用一個處理程序來延遲一秒或兩秒的處理,以允許對話框顯示,但這似乎毫無意義,讓用戶無緣無故地等待 – tyczj

+0

是的..應該不是那樣的...如何http://stackoverflow.com/questions/4538338/progressdialog-in-asynctask?你習慣於使用它嗎? –