2013-06-17 3 views
3

나는 내가 JSON에서 데이터를 가져 오는 을 생각하는 응용 프로그램을 쓰고 있어요 JSON 카테고리에서 데이터를 가져 오기, 그리고 난 카테고리목록을 가져올 수 있어요하지만 난 할 때마다 카테고리 받지 목록 중 하나를 클릭 그 특정 카테고리에 속하는 제품의 경우 항상 공백 활동을 받고 있습니다.현명한

JSON :

[ 
{ 
"categoryId": "1", 
"categoryTitle": "SmartPhones", "SmartPhones": [ 
     { 
      "itemId": "1", 
      "itemTitle": "Galaxy Mega 5.8" 
     }, 
     { 
      "itemId": "2", 
      "itemTitle": "Galaxy Mega 6.3" 
     } 
    ] 
}, 
{ 
"categoryId": "2", 
"categoryTitle": "Tablets", "Tablets": [ 
     { 
      "itemId": "1", 
      "itemTitle": "Galaxy Note 510" 
     }, 
     { 
      "itemId": "2", 
      "itemTitle": "Galaxy Note 800" 
     } 
    ] 
} 
] 

AlbumsActivity.java [카테고리에 사용]

public class AlbumsActivity extends ListActivity { 
    // Connection detector 
    ConnectionDetector cd; 

    // Alert dialog manager 
    AlertDialogManager alert = new AlertDialogManager(); 

    // Progress Dialog 
    private ProgressDialog pDialog; 

    // Creating JSON Parser object 
    JSONParser jsonParser = new JSONParser(); 

    ArrayList<HashMap<String, String>> albumsList; 

    // albums JSONArray 
    JSONArray albums = null; 

    // albums JSON url 
    private static final String URL_ALBUMS = "my.json"; //providing proper URL 

    // ALL JSON node names 
    private static final String TAG_ID = "categoryId"; 
    private static final String TAG_NAME = "categoryTitle"; 


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

     cd = new ConnectionDetector(getApplicationContext()); 

     // Check for internet connection 
     if (!cd.isConnectingToInternet()) { 
      // Internet Connection is not present 
      alert.showAlertDialog(AlbumsActivity.this, "Internet Connection Error", 
        "Please connect to working Internet connection", false); 
      // stop executing code by return 
      return; 
     } 

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

     // Loading Albums JSON in Background Thread 
     new LoadAlbums().execute(); 

     // get listview 
     ListView lv = getListView(); 

     /** 
     * Listview item click listener 
     * TrackListActivity will be lauched by passing album id 
     * */ 
     lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> arg0, View view, int arg2, 
        long arg3) { 
       // on selecting a single album 
       // TrackListActivity will be launched to show tracks inside the album 
       Intent i = new Intent(getApplicationContext(), TrackListActivity.class); 

       // send album id to tracklist activity to get list of songs under that album 
       String album_id = ((TextView) view.findViewById(R.id.album_id)).getText().toString(); 
       i.putExtra("album_id", album_id);    

       startActivity(i); 
      } 
     });  
    } 

    /** 
    * Background Async Task to Load all Albums by making http request 
    * */ 
    class LoadAlbums extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(AlbumsActivity.this); 
      pDialog.setMessage("Listing Albums ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     /** 
     * getting Albums JSON 
     * */ 
     protected String doInBackground(String... args) { 
      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      // getting JSON string from URL 
      String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET", 
        params); 

      // Check your log cat for JSON reponse 
      Log.d("Albums JSON: ", "> " + json); 

      try {    
       albums = new JSONArray(json); 

       if (albums != null) { 
        // looping through All albums 
        for (int i = 0; i < albums.length(); i++) { 
         JSONObject c = albums.getJSONObject(i); 

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


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


         // adding HashList to ArrayList 
         albumsList.add(map); 
        } 
       }else{ 
        Log.d("Albums: ", "null"); 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after getting all albums 
      pDialog.dismiss(); 
      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        /** 
        * Updating parsed JSON data into ListView 
        * */ 
        ListAdapter adapter = new SimpleAdapter(
          AlbumsActivity.this, albumsList, 
          R.layout.list_item_albums, new String[] { TAG_ID, 
            TAG_NAME }, new int[] { 
            R.id.album_id, R.id.album_name }); 

        // updating listview 
        setListAdapter(adapter); 
       } 
      }); 

     } 

    } 
} 

TrackListActivity.java은 [제품에 사용]

public class TrackListActivity extends ListActivity { 
    // Connection detector 
    ConnectionDetector cd; 

    // Alert dialog manager 
    AlertDialogManager alert = new AlertDialogManager(); 

    // Progress Dialog 
    private ProgressDialog pDialog; 

    // Creating JSON Parser object 
    JSONParser jsonParser = new JSONParser(); 

    ArrayList<HashMap<String, String>> tracksList; 

    // tracks JSONArray 
    JSONArray albums = null; 

    // Album id 
    String album_id, album_name; 

    // tracks JSON url 
    // id - should be posted as GET params to get track list (ex: id = 5) 
    private static final String URL_ALBUMS = "my.json"; //providing proper url 

    // ALL JSON node names 

    private static final String TAG_ID = "itemId"; 
    private static final String TAG_NAME = "itemTitle"; 
    private static final String TAG_ALBUM = "categoryId"; 

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

     cd = new ConnectionDetector(getApplicationContext()); 

     // Check if Internet present 
     if (!cd.isConnectingToInternet()) { 
      // Internet Connection is not present 
      alert.showAlertDialog(TrackListActivity.this, "Internet Connection Error", 
        "Please connect to working Internet connection", false); 
      // stop executing code by return 
      return; 
     } 

     // Get album id 
     Intent i = getIntent(); 
     album_id = i.getStringExtra("album_id"); 

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

     // Loading tracks in Background Thread 
     new LoadTracks().execute(); 

     // get listview 
     ListView lv = getListView(); 

     /** 
     * Listview on item click listener 
     * SingleTrackActivity will be lauched by passing album id, song id 
     * */ 
     lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> arg0, View view, int arg2, 
        long arg3) { 
       // On selecting single track get song information 
       Intent i = new Intent(getApplicationContext(), SingleTrackActivity.class); 

       // to get song information 
       // both album id and song is needed 
       String album_id = ((TextView) view.findViewById(R.id.album_id)).getText().toString(); 
       String song_id = ((TextView) view.findViewById(R.id.song_id)).getText().toString(); 

       Toast.makeText(getApplicationContext(), "Album Id: " + album_id + ", Song Id: " + song_id, Toast.LENGTH_SHORT).show(); 

       i.putExtra("album_id", album_id); 
       i.putExtra("song_id", song_id); 

       startActivity(i); 
      } 
     }); 

    } 

    /** 
    * Background Async Task to Load all tracks under one album 
    * */ 
    class LoadTracks extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(TrackListActivity.this); 
      pDialog.setMessage("Loading songs ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     /** 
     * getting tracks json and parsing 
     * */ 
     protected String doInBackground(String... args) { 
      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      // post album id as GET parameter 
      params.add(new BasicNameValuePair(TAG_ID, album_id)); 

      // getting JSON string from URL 
      String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET", 
        params); 

      // Check your log cat for JSON reponse 
      Log.d("Track List JSON: ", json); 

      try { 
       JSONObject jObj = new JSONObject(json); 
       if (jObj != null) { 
        String album_id = jObj.getString(TAG_ID); 
        album_name = jObj.getString(TAG_ALBUM); 


        if (albums != null) { 
         // looping through All songs 
         for (int i = 0; i < albums.length(); i++) { 
          JSONObject c = albums.getJSONObject(i); 

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


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

          // adding each child node to HashMap key => value 
          map.put("album_id", album_id); 
          map.put(TAG_ID, song_id);       
          map.put(TAG_NAME, name); 


          // adding HashList to ArrayList 
          tracksList.add(map); 
         } 
        } else { 
         Log.d("Albums: ", "null"); 
        } 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after getting all tracks 
      pDialog.dismiss(); 
      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        /** 
        * Updating parsed JSON data into ListView 
        * */ 
        ListAdapter adapter = new SimpleAdapter(
          TrackListActivity.this, tracksList, 
          R.layout.list_item_tracks, new String[] { "album_id", TAG_ID, 
            TAG_NAME }, new int[] { 
            R.id.album_id, R.id.song_id, R.id.album_name }); 
        // updating listview 
        setListAdapter(adapter); 

        // Change Activity Title with Album name 
        setTitle(album_name); 
       } 
      }); 

     } 

    } 
} 

답변

0

webservice에서 JSON을 JSONObject으로 읽었지만 게시 한 JSON은 JSONArray입니다. 이런 식으로 JSON을 구문 분석 해보세요.

  JSONArray jObj = new JSONArray(json); 
      if (jObj != null) { 
       for(int i = 0; i < jObj.length(); i++) { 
        JSONObject cat = jObj.getJSONObject(i); 
        String id = cat.getString("categoryId"); 
        String title = cat.getString("categoryTitle"); 
        JSONArray devices = cat.optJSONArray(title, null); 

        for(int j=0; i<devices.length(); j++) { 
         //get itemId and itemTitle 
        } 
       } 
      } 
+0

제 경우에는 작동하지 않습니다. –