JSON解析 - 如何显示第二级ListView

时间:2014-06-12 04:58:42

标签: java android json

我正在将JSON数据解析为ListView,并在MainActivity.java中成功解析了第一级JSON,其中我显示了主要位置列表,如:

  1. 内部地点

  2. 外部地点

  3. 现在我希望每当我点击内部位置然后在SecondActivity中它应该在列表中显示德里和NCR,同样适用于外部位置,在这种情况下,每当用户点击需要显示美国

    JSON看起来像:

    {
        "all": [
            {
                "title": "Inner Locations",
                "maps": [
                    {
                        "title": "Delhi",
                        "markers": [
                            {
                                "name": "Connaught Place",
                                "latitude": 28.632777800000000000,
                                "longitude": 77.219722199999980000 
                            },
                            {
                                "name": "Lajpat Nagar",
                                "latitude": 28.565617900000000000,
                                "longitude": 77.243389100000060000
                            }
                        ]
                    },
                    {
                        "title": "NCR",
                        "markers": [
                            {
                                "name": "Gurgaon",
                                "latitude": 28.440658300000000000,
                                "longitude": 76.987347699999990000
                            },
                            {
                                "name": "Noida",
                                "latitude": 28.570000000000000000,
                                "longitude": 77.319999999999940000
                            }
                        ]
                    }
                ]
            },
            {
                "title": "Outer Locations",
                "maps": [
                    {
                        "title": "United States",
                        "markers": [
                            {
                                "name": "Virgin Islands",
                                "latitude": 18.335765000000000000,
                                "longitude": -64.896335000000020000
                            },
                            {
                                "name": "Vegas",
                                "latitude": 36.114646000000000000,
                                "longitude": -115.172816000000010000
                            }
                        ]
                    }
                ]
            }
        ]
    }
    

    注意:但是每当我在第一个活动中点击任何ListItem时,没有在SecondActivity中获取任何列表,为什么?

    MainActivity.java: -

    @Override
            protected Void doInBackground(Void... params) {
                // Create an array
                arraylist = new ArrayList<HashMap<String, String>>();
                // Retrieve JSON Objects from the given URL address
                jsonobject = JSONfunctions
                        .getJSONfromURL("http://10.0.2.2/locations.json");
    
                try {
                    // Locate the array name in JSON
                    jsonarray = jsonobject.getJSONArray("all");
    
                    for (int i = 0; i < jsonarray.length(); i++) {
                        HashMap<String, String> map = new HashMap<String, String>();
                        jsonobject = jsonarray.getJSONObject(i);
                        // Retrieve JSON Objects
                        map.put("title", jsonobject.getString("title"));
    
                        arraylist.add(map);
                    }
                } catch (JSONException e) {
                    Log.e("Error", e.getMessage());
                    e.printStackTrace();
                }
                return null;
            }
    
            @Override
            protected void onPostExecute(Void args) {
                // Locate the listview in listview_main.xml
                listview = (ListView) findViewById(R.id.listview);
                // Pass the results into ListViewAdapter.java
                adapter = new ListViewAdapter(MainActivity.this, arraylist);
                // Set the adapter to the ListView
                listview.setAdapter(adapter);
                // Close the progressdialog
                mProgressDialog.dismiss();
    
                listview.setOnItemClickListener(new OnItemClickListener() {
    
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
                        Toast.makeText(MainActivity.this, String.valueOf(position), Toast.LENGTH_LONG).show();
                        // TODO Auto-generated method stub                  
                        Intent sendtosecond = new Intent(MainActivity.this, SecondActivity.class);
                        // Pass all data rank
                        sendtosecond.putExtra("title", arraylist.get(position).get(MainActivity.TITLE));
                        Log.d("Tapped Item::", arraylist.get(position).get(MainActivity.TITLE));
                        startActivity(sendtosecond);
                    }
                });         
            }
        }
    }
    

    SecondActivity.java:

       @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Get the view from listview_main.xml
        setContentView(R.layout.listview_main);
    
        Intent in = getIntent();
        strReceived = in.getStringExtra("title");
        Log.d("Received Data::", strReceived);
        // Execute DownloadJSON AsyncTask
        new DownloadJSON().execute();
    }
    
    // DownloadJSON AsyncTask
    private class DownloadJSON extends AsyncTask<Void, Void, Void> {
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }
    
        @Override
        protected Void doInBackground(Void... params) {
            // Create an array
            arraylist = new ArrayList<HashMap<String, String>>();
            // Retrieve JSON Objects from the given URL address
            jsonobject = JSONfunctions
                    .getJSONfromURL("http://10.0.2.2/locations.json");
    
            try {
                // Locate the array name in JSON
                jsonarray = jsonobject.getJSONArray("maps");
    
                for (int i = 0; i < jsonarray.length(); i++) {
                    HashMap<String, String> map = new HashMap<String, String>();
                    jsonobject = jsonarray.getJSONObject(i);
                    // Retrieve JSON Objects
                    map.put("title", jsonobject.getString("title"));
    
                    arraylist.add(map);
                }
            } catch (JSONException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
    

2 个答案:

答案 0 :(得分:2)

尝试以下方法: -

        try
        {
            JSONObject j = new JSONObject("your json response");
            JSONArray all = j.getJSONArray("all");
            for (int i = 0; i < all.length(); i++)
            {
                JSONObject data = all.getJSONObject(i);
                System.out.println("title       =>"+data.getString("title"));
                JSONArray maps = data.getJSONArray("maps");
                for (int k = 0; k < maps.length(); k++)
                {
                    JSONObject data_sec = maps.getJSONObject(k);
                    System.out.println("name        => "+data_sec.getString("name"));
                    System.out.println("latitude    => "+data_sec.getString("latitude"));
                    System.out.println("longitude   => "+data_sec.getString("longitude"));

                }


            }
        }
        catch (Exception e)
        {
            // TODO: handle exception
        }

答案 1 :(得分:0)

// Try this way,hope this will help you to solve your problem.

@Override
protected Void doInBackground(Void... params) {
        // Create an array
        arraylist = new ArrayList<HashMap<String, String>>();
        // Retrieve JSON Objects from the given URL address
        jsonobject = JSONfunctions
        .getJSONfromURL("http://10.0.2.2/locations.json");

        try {
        // Locate the array name in JSON
        jsonarray = jsonobject.getJSONArray("all");

        for (int i = 0; i < jsonarray.length(); i++) {
        HashMap<String, String> map = new HashMap<String, String>();
        jsonobject = jsonarray.getJSONObject(i);
        // Retrieve JSON Objects
        map.put("title", jsonobject.getString("title"));
        map.put("index", i);

        arraylist.add(map);
        }
        } catch (JSONException e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
        }
        return null;
        }

@Override
protected void onPostExecute(Void args) {
        // Locate the listview in listview_main.xml
        listview = (ListView) findViewById(R.id.listview);
        // Pass the results into ListViewAdapter.java
        adapter = new ListViewAdapter(MainActivity.this, arraylist);
        // Set the adapter to the ListView
        listview.setAdapter(adapter);
        // Close the progressdialog
        mProgressDialog.dismiss();

        listview.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
        Toast.makeText(MainActivity.this, String.valueOf(position), Toast.LENGTH_LONG).show();
        // TODO Auto-generated method stub                  
        Intent sendtosecond = new Intent(MainActivity.this, SecondActivity.class);
        // Pass all data rank
        sendtosecond.putExtra("title", arraylist.get(position).get(MainActivity.TITLE));
        sendtosecond.putExtra("index", arraylist.get(position).get(MainActivity.INDEX));
        Log.d("Tapped Item::", arraylist.get(position).get(MainActivity.TITLE));
        Log.d("Tapped Item Index::", arraylist.get(position).get(MainActivity.INDEX));
        startActivity(sendtosecond);
        }
        });
        }
        }
        }

@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Get the view from listview_main.xml
        setContentView(R.layout.listview_main);

        Intent in = getIntent();
        strReceived = in.getStringExtra("title");
        strReceivedIndex = in.getStringExtra("index");
        Log.d("Received Data::", strReceived);
        // Execute DownloadJSON AsyncTask
        new DownloadJSON().execute();
        }

// DownloadJSON AsyncTask
private class DownloadJSON extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Create an array
        arraylist = new ArrayList<HashMap<String, String>>();
        // Retrieve JSON Objects from the given URL address
        jsonobject = JSONfunctions
                .getJSONfromURL("http://10.0.2.2/locations.json");

        try {
            // Locate the array name in JSON
            jsonarray = jsonobject.getJSONArray("all").getJSONObject(Integer.parseInt(strReceivedIndex)).getgetJSONArray("maps");

            for (int i = 0; i < jsonarray.length(); i++) {
                HashMap<String, String> map = new HashMap<String, String>();
                jsonobject = jsonarray.getJSONObject(i);
                // Retrieve JSON Objects
                map.put("title", jsonobject.getString("title"));

                arraylist.add(map);
            }
        } catch (JSONException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }