代码之家  ›  专栏  ›  技术社区  ›  astric mobiles

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

  •  0
  • astric mobiles  · 技术社区  · 8 年前

    我试图解析一些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 回复  |  直到 8 年前
        1
  •  4
  •   Pavneet_Singh    8 年前
    • 在循环之前创建列表
    • 在每次迭代中在列表中添加元素,而不是将最后一个元素添加到列表中

    否则,它将仅显示您试图在循环后添加的最后一项(由于lineName local作用域导致编译时错误)

    // 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);
    
        2
  •  2
  •   muazhud    8 年前

    这是工作代码。

    @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