JSON解析到列表视图

时间:2012-09-27 04:18:24

标签: android json android-listview

我正在为link解析json,我想通过仅使用ArrayLists和Array Adapter在列表视图中解析后显示数据。

但我只获得了索引的最后一个值。

这是我的代码

JSONPARSE.java

public class JsonParse extends Activity {

    ArrayList<contactsGS> contacts = new ArrayList<contactsGS>();

    ListView lv_contacts;
    InputStream is = null;
    String jsonString;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_json_parse);

        lv_contacts = (ListView)findViewById(R.id.lv_jsonParse);

        is = CommonUtilJson.getInputStream("http://api.androidhive.info/contacts/");
        jsonString = CommonUtilJson.inputStreamToString(is);
        ParseCode parse = new ParseCode(jsonString);
        contacts=parse.parseValues();

        ArrayAdapter adapter = new ArrayAdapter<contactsGS>(this, android.R.layout.simple_list_item_1,contacts);
        lv_contacts.setAdapter(adapter);

    }

    public String getJsonSring(String api_url) throws URISyntaxException,
    ClientProtocolException, IOException {
        try {
            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            URL url = new URL(api_url);
            URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(),
                    url.getQuery(), null);
            request.setURI(uri);

            HttpResponse response = client.execute(request);
            InputStream ips = response.getEntity().getContent();
            BufferedReader buf = new BufferedReader(new InputStreamReader(ips));

            StringBuilder sb = new StringBuilder();
            String s;
            while (true) {
                s = buf.readLine();
                if (s == null || s.length() == 0)
                    break;
                sb.append(s);

            }
            buf.close();
            ips.close();
            return sb.toString();

        }

        finally {
            // any cleanup code...
        }

    }   
    }

这是我解析代码的类。

PARSECODE.java

    public class ParseCode {

        String jsonString;
        public static String url = "http://api.androidhive.info/contacts/";
        ArrayList<contactsGS> contactsData = new ArrayList<contactsGS>();
        ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String,String>>();
        contactsGS gtrSeter = new contactsGS();
        public ParseCode(String jsonString){
            this.jsonString = jsonString;
        }

        JSONObject jsonObj = null;

        public ArrayList<contactsGS> parseValues(){

            try{

                jsonObj = new JSONObject(jsonString);

                JSONArray jsonArray = jsonObj.getJSONArray("contacts");
                for(int index =0 ; index<jsonArray.length();index++){

                    JSONObject contacts = jsonArray.getJSONObject(index);

                    String id = contacts.getString("id");
                    gtrSeter.setId(id);
                    String name = contacts.getString("name");
                    gtrSeter.setName(name);
                    String email = contacts.getString("email");
                    gtrSeter.setEmail(email);
                    String address = contacts.getString("address");
                    gtrSeter.setAddress(address);
                    String gender = contacts.getString("gender");

                    JSONObject phoneObj = contacts.getJSONObject("phone");
                    String mobile = phoneObj.getString("mobile");
                    gtrSeter.setMobile(mobile);
                    String home = phoneObj.getString("home");
                    String office = phoneObj.getString("office");


                   contactsData.add(gtrSeter);

                }
            }
            catch(Exception e){

                e.printStackTrace();
            }
            return contactsData;
        }

    }

这是我的Getter Setter类

ContactGS.java

public class contactsGS {

    public String id;
    public String name;
    public String email;
    public String address;
    public String mobile;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    private static contactsGS singletonObject;

    public static contactsGS getSingletonObject(){

        if(singletonObject==null){
            singletonObject = new contactsGS();
        }
        return singletonObject;
    }

}

请帮帮我。我想在列表视图的一行中获取一个人的详细信息。

提前致谢

2 个答案:

答案 0 :(得分:3)

将每个contactGS添加到循环中的arraylist,在for循环中创建ContactGS

contactsGS gtrSeter = new contactsGS();

在for循环的末尾添加此行

contactsData.add(gtrSeter );
像这样

for(int index =0 ; index<jsonArray.length();index++){

   contactsGS gtrSeter = new contactsGS();
   JSONObject contacts = jsonArray.getJSONObject(index);

   String id = contacts.getString("id");
   gtrSeter.setId(id);
   String name = contacts.getString("name");
   gtrSeter.setName(name);
   String email = contacts.getString("email");
   gtrSeter.setEmail(email);
   String address = contacts.getString("address");
   gtrSeter.setAddress(address);
   String gender = contacts.getString("gender");

   JSONObject phoneObj = contacts.getJSONObject("phone");
   String mobile = phoneObj.getString("mobile");
   gtrSeter.setMobile(mobile);
   String home = phoneObj.getString("home");
   String office = phoneObj.getString("office");

   contactsData.add(gtrSeter);

}

答案 1 :(得分:1)

请更改您的代码,如下所示。

在公共类ParseCode

你定义了,只需在这里声明并在每次循环时初始化它。

contactsGS gtrSeter = new contactsGS();

改变
contactsGS gtrSeter;

并在public ArrayList中使用parseValues()方法 in for循环写第一个语句。

gtrSeter = new contactsGS();

所以你的代码应该是这样的。

for(int index =0 ; index<jsonArray.length();index++){
   gtrSeter = new contactsGS();
   JSONObject contacts = jsonArray.getJSONObject(index);
.
.
.
.
.
.
.
}