Getting data from JSON into a list view

I am trying to retrieve data from JSON in a ListView, but every time I get a blank page without getting a Category List or an error.

I am new to Android and trying to make a Multi Level ListView using JSON ,

In my case, I want to achieve this using only JSON : Category> Elements> Details

but I ran into a problem on the first screen, even without being able to select Category

JSON:

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

Thanks @Segi for giving me the correct JSON format

Action Code:

  public class CategoriesActivity 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>> categoriesList; // albums JSONArray JSONArray categories = null; // albums JSON url private static final String URL_CATEGORIES = "my.json"; // providing proper URL // ALL JSON node names private static final String TAG_ID = "categoryId"; private static final String TAG_TITLE = "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(CategoriesActivity.this, "Internet Connection Error", "Please connect to working Internet connection", false); // stop executing code by return return; } // Hashmap for ListView categoriesList = new ArrayList<HashMap<String, String>>(); // Loading Categories JSON in Background Thread new LoadCategories().execute(); // get listview ListView lv = getListView(); /** * Listview item click listener * ProductListActivity will be lauched by passing category id * */ lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) { // on selecting a single category // ProductListActivity will be launched to show products inside the category Intent i = new Intent(getApplicationContext(), TrackListActivity.class); // send category id to productlist activity to get list of products under that category String category_id = ((TextView) view.findViewById(R.id.album_id)).getText().toString(); i.putExtra("category_id", category_id); startActivity(i); } }); } /** * Background Async Task to Load all Categories by making http request * */ class LoadCategories extends AsyncTask<String, String, String> { /** * Before starting background thread Show Progress Dialog * */ @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(CategoriesActivity.this); pDialog.setMessage("Listing Categories ..."); pDialog.setIndeterminate(false); pDialog.setCancelable(false); pDialog.show(); } /** * getting Categories JSON * */ protected String doInBackground(String... args) { // Building Parameters List<NameValuePair> params = new ArrayList<NameValuePair>(); // getting JSON string from URL String json = jsonParser.makeHttpRequest(URL_CATEGORIES, "GET", params); // Check your log cat for JSON reponse Log.d("Categories JSON: ", "> " + json); try { categories = new JSONArray(json); if (categories != null) { // looping through all categories for (int i = 0; i < categories.length(); i++) { JSONObject c = categories.getJSONObject(i); // Storing each json item values in variable String id = c.getString(TAG_ID); String title = c.getString(TAG_TITLE); // 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_TITLE, title); // adding HashList to ArrayList categoriesList.add(map); } }else{ Log.d("Categories: ", "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 categories pDialog.dismiss(); // updating UI from Background Thread runOnUiThread(new Runnable() { public void run() { /** * Updating parsed JSON data into ListView * */ ListAdapter adapter = new SimpleAdapter( CategoriesActivity.this, categoriesList, R.layout.list_item_albums, new String[] { TAG_ID, TAG_TITLE }, new int[] { R.id.category_id, R.id.category_title }); // updating listview setListAdapter(adapter); } }); } } } 

Logcat:

 06-15 12:21:27.124: D/dalvikvm(786): GC_FOR_ALLOC freed 68K, 8% free 2488K/2680K, paused 173ms, total 213ms 06-15 12:21:27.174: I/dalvikvm-heap(786): Grow heap (frag case) to 3.152MB for 635812-byte allocation 06-15 12:21:27.264: D/dalvikvm(786): GC_FOR_ALLOC freed 1K, 6% free 3108K/3304K, paused 89ms, total 89ms 06-15 12:21:27.354: D/dalvikvm(786): GC_CONCURRENT freed <1K, 6% free 3111K/3304K, paused 5ms+3ms, total 95ms 06-15 12:21:28.274: I/Choreographer(786): Skipped 41 frames! The application may be doing too much work on its main thread. 06-15 12:21:28.874: I/Choreographer(786): Skipped 123 frames! The application may be doing too much work on its main thread. 06-15 12:21:29.044: D/gralloc_goldfish(786): Emulator without GPU emulation detected. 06-15 12:21:29.134: D/dalvikvm(786): GC_CONCURRENT freed 19K, 4% free 3478K/3620K, paused 8ms+38ms, total 268ms 06-15 12:21:30.894: I/Choreographer(786): Skipped 51 frames! The application may be doing too much work on its main thread. 06-15 12:20:36.624: D/Categories JSON:(786): > { 06-15 12:20:36.624: D/Categories JSON:(786): "categoryId": "1", 06-15 12:20:36.624: D/Categories JSON:(786): "categoryTitle": { 06-15 12:20:36.624: D/Categories JSON:(786): "SmartPhones": [ 06-15 12:20:36.624: D/Categories JSON:(786): { 06-15 12:20:36.624: D/Categories JSON:(786): "itemId": "1", 06-15 12:20:36.624: D/Categories JSON:(786): "itemTitle": "Galaxy Mega 5.8" 06-15 12:20:36.624: D/Categories JSON:(786): }, 06-15 12:20:36.624: D/Categories JSON:(786): { 06-15 12:20:36.624: D/Categories JSON:(786): "itemId": "2", 06-15 12:20:36.624: D/Categories JSON:(786): "itemTitle": "Galaxy Mega 6.3" 06-15 12:20:36.624: D/Categories JSON:(786): } 06-15 12:20:36.624: D/Categories JSON:(786): ] 06-15 12:20:36.624: D/Categories JSON:(786): }, 06-15 12:20:36.624: D/Categories JSON:(786): "categoryId": "2", 06-15 12:20:36.624: D/Categories JSON:(786): "categoryTitle": {"Tablets": [ 06-15 12:20:36.624: D/Categories JSON:(786): { 06-15 12:20:36.624: D/Categories JSON:(786): "itemId": "1", 06-15 12:20:36.624: D/Categories JSON:(786): "itemTitle": "Galaxy Note 510" 06-15 12:20:36.624: D/Categories JSON:(786): }, 06-15 12:20:36.624: D/Categories JSON:(786): { 06-15 12:20:36.624: D/Categories JSON:(786): "itemId": "2", 06-15 12:20:36.624: D/Categories JSON:(786): "itemTitle": "Galaxy Note 800" 06-15 12:20:36.624: D/Categories JSON:(786): } 06-15 12:20:36.624: D/Categories JSON:(786): ]} 06-15 12:20:36.624: D/Categories JSON:(786): } 06-15 12:20:36.814: W/System.err(786): org.json.JSONException: Value {"categoryTitle":{"SmartPhones":[{"itemId":"1","itemTitle":"Galaxy Mega 5.8"},{"itemId":"2","itemTitle":"Galaxy Mega 6.3"}]},"categoryId":"2"} of type org.json.JSONObject cannot be converted to JSONArray 06-15 12:20:36.824: W/System.err(786): at org.json.JSON.typeMismatch(JSON.java:111) 06-15 12:20:36.836: W/System.err(786): at org.json.JSONArray.<init>(JSONArray.java:91) 06-15 12:20:36.836: W/System.err(786): at org.json.JSONArray.<init>(JSONArray.java:103) 06-15 12:20:36.904: W/System.err(786): at com.my.json.CategoriesActivity$LoadCategories.doInBackground(CategoriesActivity.java:135) 06-15 12:20:36.904: W/System.err(786): at com.my.json.CategoriesActivity$LoadCategories.doInBackground(CategoriesActivity.java:1) 06-15 12:20:36.914: W/System.err(786): at android.os.AsyncTask$2.call(AsyncTask.java:287) 06-15 12:20:36.914: W/System.err(786): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 06-15 12:20:36.925: W/System.err(786): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 06-15 12:20:36.925: W/System.err(786): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 06-15 12:20:36.934: W/System.err(786): at java.lang.Thread.run(Thread.java:856) 06-15 12:20:45.984: D/InputEventConsistencyVerifier(786): KeyEvent: ACTION_UP but key was not down. 06-15 12:20:45.984: D/InputEventConsistencyVerifier(786): in android.view.ViewRootImpl@40de89c8 06-15 12:20:45.984: D/InputEventConsistencyVerifier(786): 0: sent at 106936000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=229, metaState=0, flags=0x8, repeatCount=0, eventTime=106936, downTime=106820, deviceId=0, source=0x101 } 

Note. Getting empty action, not getting data in ListView, no errors

+4
source share
6 answers

JSON is valid, but illogical, should be like that

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

Then the code will be:

  if (categories != null) { // looping through All albums for (int i = 0; i < categories.length(); i++) { JSONObject oneCategory = categories.getJSONObject(i); String categoryName = oneCategory.getString(TAG_ID); String catTitle = oneCategory.getString( TAG_TITLE ); JSONArray categoryTitle = oneCategory.getJSONArray(catTitle); for( int i = 0 ; i < categoryTitle.length() ; i++ ) { JSONObject item = categoryTitle.getJSONObject(i); String id = item.getString("itemId"); String name = item.getString("itemTitle"); // 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_TITLE, name); } // adding HashList to ArrayList categoriesList.add(map); } }else{ Log.d("Categories: ", "null"); } 
+1
source

Yes, it is clear from Logcat that there is a problem with JSON.

Just try the following JSON .->

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

I did nothing special, but added some brackets to make it a JSON format. If you get this from php, make the necessary changes to format it.

NB: Here JSON has a complex structure, so be careful when parsing.

+1
source
 "categoryTitle" : "Appetizers" : [ 

and

 "categoryTitle" : "Mixed Platter" : [ 

This is not true. What are you trying to do?

0
source

Try below Json:

 { "categoryId": "1", "categoryTitle": { "Appetizers": [ { "itemId": "1", "itemTitle": "Samosa" }, { "itemId": "2", "itemTitle": "Vegetable Pakora" } ] }, "categoryId": "2", "categoryTitle": {"Mixed Platter": [ { "itemId": "1", "itemTitle": "Veggie" }, { "itemId": "2", "itemTitle": "Non Veggie" } ]} } 
0
source
 String json = "{'categoryId': '1', 'categoryTitle': {'Appetizers': [{'itemId': '1','itemTitle': 'Samosa'},{'itemId': '2','itemTitle': 'Vegetable Pakora'}]}},{'categoryId': '2', 'categoryTitle': {'Appetizers': [{'itemId': '1','itemTitle': 'Samosa'},{'itemId': '2','itemTitle': 'Vegetable Pakora'}]}}"; try { json = "[" + json + "]"; JSONArray mArray = new JSONArray(json); for (int i = 0; i < mArray.length(); i++) { JSONObject mJsonObject = new JSONObject(mArray.get(0) .toString()); String categoryId = mJsonObject.getString("categoryId"); String categoryTitle = mJsonObject.getString("categoryTitle"); mJsonObject = new JSONObject(categoryTitle); String mVal = mJsonObject.toString().split(":")[0].replace( "\"", "").replace("{", ""); String Resutlt = mJsonObject.getString(mVal); JSONArray mArray1 = new JSONArray(Resutlt); for (int j = 0; j < mArray1.length(); j++) { mJsonObject = mArray1.getJSONObject(j); String itemId = mJsonObject.getString("itemId"); String itemTitle = mJsonObject.getString("itemTitle"); } } } catch (JSONException e) { e.printStackTrace(); } 
0
source

try installing the adapter in the list immediately after exiting the loop (JSON Looping)

0
source

Source: https://habr.com/ru/post/1486371/


All Articles