android - 从 JSON 中获取数据到 ListView

标签 android json android-listview

我正在尝试从 JSON 中获取数据ListView 中,但每次我都得到空白页面,既没有得到类别列表也没有错误。

我是 Android 新手,正在尝试使用 JSON 制作多级 ListView

在我的例子中,我只想使用 JSON 实现此目的:Category > Items > Detail

但我在第一个屏幕上遇到问题,甚至无法获取类别

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"
        }
    ]}
}

感谢@Segi 给我正确的 JSON 格式

Activity 代码:

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

日志:

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 }

注意:得到的是空白Activity,没有得到数据到ListView,没有得到任何错误

最佳答案

JSON是合法的,但是不合逻辑,应该是这样的

[
{
"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"
        }
    ]
}
]

然后代码将是:

            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");
            }

关于android - 从 JSON 中获取数据到 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17122333/

相关文章:

android - NumberFormatException 日历长整型无效

Android Assets - FileNotFound

Android Studio,修改 "foreach"命令返回行的样式在哪里

c# - JSON 中的 23,908 个对象 我尝试在将属性添加到 SQL 数据库之前将它们添加到属性中

ios - RestKit 嵌套同类型对象 -- JSON 集合错误

android - 为什么我的 ListView 不显示任何元素?

android - 如何在 Windows 中压缩对齐 apk 文件

php - 缓存 API 数据 Laravel 5.2

android - System.out resolveUri 在错误的位图 uri : https://. 上失败 .. 当我尝试将图片从 Web 插入到 ListView 时

java - 更改 Android Listview ArrayAdapter 中最后一项的布局