1

リンクの 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;
        }

    }

これが私のゲッターセッタークラスです

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

}

私を助けてください。リストビューの1行で1人の詳細を取得したい。

前もって感謝します

4

2 に答える 2

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

}
于 2012-09-27T04:24:56.787 に答える
1

次のようにコードを変更してください。

public クラスの ParseCode で

ここで宣言し、ループで毎回初期化するだけです。

contactsGS gtrSeter = new contactsGS();

で変わる

contactsGS gtrSeter;

そして for ループの public ArrayList parseValues() メソッドで最初のステートメントを書きます。

gtrSeter = new contactsGS();

あなたのコードはこれを好むはずです。

for(int index =0 ; index<jsonArray.length();index++){
   gtrSeter = new contactsGS();
   JSONObject contacts = jsonArray.getJSONObject(index);
.
.
.
.
.
.
.
}
于 2012-09-27T04:36:21.373 に答える