2013-05-12 78 views
0

我試圖採取JSONObject並在列表視圖中顯示。對於對象的請求返回的必要內容,似乎代碼的其餘部分是不工作....JSONObject不會顯示在列表視圖

這裏是我的代碼:

import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.URL; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.app.NavUtils; 
import android.util.JsonReader; 
import android.util.Log; 
import android.view.MenuItem; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 


public class DisplayServiceActivity extends ListActivity { 
    private ListView listOfServices; 

    //JSONArrays? 
    JSONArray directory; 


    //JSON Node names 
    private static String TAG_ID = "id"; 
    private static String TAG_NAME= "name"; 
    private static String TAG_DIRECTORY = "Categories"; 
    private final static String url= "APILINKHERE"; 
    JSONObject json; 
    jsonParser jParser = new jsonParser(); 
    ArrayList<HashMap<String, String>> directoryList; 

    @SuppressLint("NewApi") 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Request request = new Request(); 
     request.execute(); 

     listOfServices =getListView(); //get builtin listView 


     directoryList = new ArrayList<HashMap<String, String>>(); 

     ListAdapter adapter = new SimpleAdapter(this, 
       directoryList, 
       R.layout.list_item, 
       new String[] { TAG_ID,TAG_NAME }, 
       new int[] { android.R.id.text1,android.R.id.text2 }); 

     setListAdapter(adapter); 
     setContentView(R.layout.service); 
     // Make sure we're running on Honeycomb or higher to use ActionBar APIs 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      // Show the Up button in the action bar. 
      getActionBar().setDisplayHomeAsUpEnabled(true); 
     } 
    }// end of onCreate Method 
    @SuppressWarnings("unused") 
    public class Request extends AsyncTask<String, Void, JSONObject> { 

     private static final int REGISTRATION_TIMEOUT = 3 * 1000; 
     private static final int WAIT_TIMEOUT = 30 * 1000; 
     private ProgressDialog dialog = 
       new ProgressDialog(DisplayServiceActivity.this); 


     protected void onPreExecute() { 
      dialog = new ProgressDialog(DisplayServiceActivity.this); 
      dialog.setMessage("Getting your info real quick... Please wait..."); 
      dialog.show(); 
     } 

     protected JSONObject doInBackground(String... params) { 

      json = jParser.getJSONfromURL(url); 
      Log.e("JSON Variable", "json returns this value: " + json); 

      return json; 

     } 

     protected void onPostExecute(JSONObject s) {   
      super.onPostExecute(s); 

      dialog.dismiss(); 
      Log.e("Test JSON","JSON s returns: " + s); 
      try { 
       directory = s.getJSONArray("Categories"); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      for(int i = 0; i< directory.length(); i++){ 
       String str_id = directory.optString(i, "id"); 
       String str_name = directory.optString(i, "name"); 
       displayCatList(str_id, str_name); 

       Log.e("Test directory","Directory returns: " + json); 
      } 

     } 

    } 

    public void displayCatList(String id, String name){     

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

     //add each child node to HashMap key 
     map.put(TAG_ID, id); 
     map.put(TAG_NAME, name); 

     //adding HashList to ArrarList 
     directoryList.add(map); 


    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

的logcat:

05-12 17:26:33.165: I/Adreno200-EGLSUB(10190): <ConfigWindowMatch:2087>: Format RGBA_8888. 
05-12 17:26:34.497: E/success(10190): created object: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.497: E/JSON Variable(10190): json returns this value: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.537: E/Test JSON(10190): JSON s returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.537: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.537: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.537: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.547: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.547: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.547: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.547: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.547: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.547: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.557: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 
05-12 17:26:34.557: E/Test directory(10190): Directory returns: {"Categories":[{"id":"2","name":"Glass Repair"},{"id":"3","name":"Appliance Repair"},{"id":"4","name":"Air Conditioning"},{"id":"5","name":"Community Involvement"},{"id":"6","name":"Electrical"},{"id":"7","name":"Flooring"},{"id":"8","name":"Heating Repair"},{"id":"9","name":"Landscaping"},{"id":"10","name":"Plumbing"},{"id":"11","name":"Remodeling\/Renovation"},{"id":"12","name":"Window Coverings"}]} 

,因爲您可以看到JSON信息正在被拖動,但從那裏沒有太多的工作。在應用程序本身,屏幕只是保持空白,沒有列表視圖或它被填充。

回答

1

中的AsyncTask執行的背景,所以到時候directlyList越來越稀少,你將它設置爲listAdapter,你需要setListAdapterdirectoryList

人口後,您在onPostExecute這樣有setListAdapter - >

protected void onPostExecute(JSONObject s) {   
     super.onPostExecute(s); 

     dialog.dismiss(); 
     Log.e("Test JSON","JSON s returns: " + s); 
     try { 
      directory = s.getJSONArray("Categories"); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     for(int i = 0; i< directory.length(); i++){ 
      String str_id = directory.optString(i, "id"); 
      String str_name = directory.optString(i, "name"); 
      displayCatList(str_id, str_name); 

      Log.e("Test directory","Directory returns: " + json); 
     } 
     listOfServices = DisplayServiceActivity.this.getListView(); //get builtin listView 
     ListAdapter adapter = new SimpleAdapter(DisplayServiceActivity.this, 
      directoryList, 
      R.layout.list_item, 
      new String[] { TAG_ID,TAG_NAME }, 
      new int[] { android.R.id.text1,android.R.id.text2 }); 

     setListAdapter(adapter); 
    } 
0

我想你是在檢索JSON數據之前設置ListAdapter。嘗試在onPostExecute方法中設置您的listadapter並查看是否有效。或者撥打onPostExecute中列表適配器的notifyDataSetChanged()方法。

我personnaly總是讓我自己的實現列表適配器通過在內部類繼承BaseAdapter

1

的JSONObject不顯示在列表視圖

,因爲你逝去的directoryList添加項目到前適配器那麼您需要在displayCatList方法內創建適配器實例,而不是像onCreate方法那樣:

public void displayCatList(String id, String name){     

     //....your code here 

     //adding HashList to ArrarList 
     directoryList.add(map); 

     // set Adapter for ListView here 

      ListAdapter adapter = new SimpleAdapter(DisplayServiceActivity.this, 
       directoryList, 
       R.layout.list_item, 
       new String[] { TAG_ID,TAG_NAME }, 
       new int[] { android.R.id.text1,android.R.id.text2 }); 

     DisplayServiceActivity.this.setListAdapter(adapter); 
    } 
+0

這樣做了!非常感謝你。 – user1890328 2013-05-12 21:41:05