【问题标题】:How to pass data from a JSON array to a list view Android如何将数据从 JSON 数组传递到 Android 列表视图
【发布时间】:2018-04-13 21:02:03
【问题描述】:

我正在尝试解析一些 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);

【问题讨论】:

    标签: android json listview android-volley


    【解决方案1】:

    这是工作代码。

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

    结果如下:

    【讨论】:

      【解决方案2】:
      • 在循环之前创建列表
      • 在每次迭代中添加列表中的元素,而不是将最后一个元素添加到列表中

      否则它将仅显示您在循环后尝试添加的最后一项(由于 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 2015-08-30
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多