如何将数据从JSON数组传递到Android列表视图

时间:2017-11-01 14:01:07

标签: android json listview android-volley

我正在尝试解析一些JSON。我正在尝试遍历JSON数组并从每个对象获取所有“ID”并使用它们填充列表视图。我已经尝试了很多方法,但无处可去。请参阅下面的代码。

String url = "https://api.tfl.gov.uk/line/mode/tube/status";
JsonArrayRequest jsArrayRequest = new JsonArrayRequest (Request.Method.GET, url, null, new Response.Listener<JSONArray>() {

    @Override
    public void onResponse(JSONArray response) {

        int data = 0;

        try {
            // Loop through the array elements
            for (int i = 0; i < response.length(); i++) {

                // Get current json object
                JSONObject line = response.getJSONObject(i);

                // Get the current line (json object) data
                String lineName = line.getString("id");

                // Display the formatted json data in text view
                // lineNameTextView.setText(lineName);
            }

        ListView myListView = (ListView)findViewById(R.id.myListView);
        ArrayList<String> tubeLines = new ArrayList<String>();

        tubeLines.add(lineName);

        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tubeLines);
        myListView.setAdapter(arrayAdapter);

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.e("TAG", "Error response:", error);
    }
});

//  tempTextView.setText("Response: " + response.toString());
// Log.v("status", "Response: " + tempTextView.toString());
// Access the RequestQueue through your singleton class.
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(jsArrayRequest);

2 个答案:

答案 0 :(得分:3)

  • 在循环前创建列表
  • 在每次迭代中添加列表中的元素,而不是将最后一个元素添加到列表中

否则它将仅显示您在循环后尝试添加的最后一项(由于lineName本地范围导致编译时错误)

// initialize list
ArrayList<String> tubeLines = new ArrayList<String>();

for(int i=0;i<response.length();i++) {

    // Get current json object
    JSONObject line = response.getJSONObject(i);

    // Get the current line (json object) data
    // To avoid crash use optString 
    String lineName = line.optString("id","N/A");
    // add all items
    tubeLines.add(lineName);

}

ListView myListView = (ListView)findViewById(R.id.myListView);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tubeLines);
myListView.setAdapter(arrayAdapter);

答案 1 :(得分:2)

这是工作代码。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final ListView listView = (ListView) findViewById(R.id.list_view);
    final ArrayList<String> tubeLines = new ArrayList<>();

    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tubeLines);
    listView.setAdapter(arrayAdapter);

    RequestQueue queue = Volley.newRequestQueue(this);
    String url ="https://api.tfl.gov.uk/line/mode/tube/status";

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONArray array = new JSONArray(response);
                        for (int i = 0; i < array.length(); i++) {
                            JSONObject object = array.optJSONObject(i);
                            String line = object.optString("id");
                            if (line != null) {
                                tubeLines.add(line);
                            }
                        }
                        // Once we added the string to the array, we notify the arrayAdapter
                        arrayAdapter.notifyDataSetChanged();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
        }
    });
    queue.add(stringRequest);

}

结果如下:

enter image description here