Android tutorial: How to parse / read JSON data into a Android ListView
Today we get on with our series that will connect our Android applications to internet webservices!
Next up in line: from JSON to a Listview. A lot of this project is identical to the previous post in this series so try to look there first if you have any problems. On the bottom of the post ill add the Eclipse project with the source.
For this example i made use of an already existing JSON webservice located here.
This is a piece of the JSON array that gets returned:
01.
{"earthquakes": [
02.
{
03.
"eqid": "c0001xgp",
04.
"magnitude": 8.8,
05.
"lng": 142.369,
06.
"src": "us",
07.
"datetime": "2011-03-11 04:46:23",
08.
"depth": 24.4,
09.
"lat": 38.322
10.
},
11.
{
12.
"eqid": "2007hear",
13.
"magnitude": 8.4,
14.
"lng": 101.3815,
15.
"src": "us",
16.
"datetime": "2007-09-12 09:10:26",
17.
"depth": 30,
18.
"lat": -4.5172
19.
}
20.
<--more -->
21.
22.
]}
So how do we get this data into our application! Behold our getJSON class!
getJSON(String url)
01.
public
static
JSONObject getJSONfromURL(String url){
02.
03.
//initialize
04.
InputStream is =
null
;
05.
String result =
""
;
06.
JSONObject jArray =
null
;
07.
08.
//http post
09.
try
{
10.
HttpClient httpclient =
new
DefaultHttpClient();
11.
HttpPost httppost =
new
HttpPost(url);
12.
HttpResponse response = httpclient.execute(httppost);
13.
HttpEntity entity = response.getEntity();
14.
is = entity.getContent();
15.
16.
}
catch
(Exception e){
17.
Log.e(
"log_tag"
,
"Error in http connection "
+e.toString());
18.
}
19.
20.
//convert response to string
21.
try
{
22.
BufferedReader reader =
new
BufferedReader(
new
InputStreamReader(is,
"iso-8859-1"
),
8
);
23.
StringBuilder sb =
new
StringBuilder();
24.
String line =
null
;
25.
while
((line = reader.readLine()) !=
null
) {
26.
sb.append(line +
"\n"
);
27.
}
28.
is.close();
29.
result=sb.toString();
30.
}
catch
(Exception e){
31.
Log.e(
"log_tag"
,
"Error converting result "
+e.toString());
32.
}
33.
34.
//try parse the string to a JSON object
35.
try
{
36.
jArray =
new
JSONObject(result);
37.
}
catch
(JSONException e){
38.
Log.e(
"log_tag"
,
"Error parsing data "
+e.toString());
39.
}
40.
41.
return
jArray;
42.
}
The code above can be divided in 3 parts.
- the first part makes the HTTP call
- the second part converts the stream into a String
- the third part converts the string to a JSPNObject
Now we only have to implement this into out ListView. We can use the same method as in the XML tutorial. We make a HashMap that stores our data and we put JSON values in the HashMap. After that we will bind that HashMap to a SimpleAdapter. Here is how its done:
Implementation
01.
ArrayList<HashMap<String, String>> mylist =
new
ArrayList<HashMap<String, String>>();
02.
03.
//Get the data (see above)
04.
JSONObject json =
05.
JSONfunctions.getJSONfromURL(
"http://api.geonames.org/postalCodeSearchJSON?formatted=true&;postalcode=9791&maxRows=10&username=demo&style=full"
);
06.
07.
try
{
08.
//Get the element that holds the earthquakes ( JSONArray )
09.
JSONArray earthquakes = json.getJSONArray(
"earthquakes"
);
10.
11.
//Loop the Array
12.
for
(
int
i=
0
;i < earthquakes.length();i++){
13.
14.
HashMap<String, String> map =
new
HashMap<String, String>();
15.
JSONObject e = earthquakes.getJSONObject(i);
16.
17.
map.put(
"id"
, String.valueOf(i));
18.
map.put(
"name"
,
"Earthquake name:"
+ e.getString(
"eqid"
));
19.
map.put(
"magnitude"
,
"Magnitude: "
+ e.getString(
"magnitude"
));
20.
mylist.add(map);
21.
}
22.
}
catch
(JSONException e) {
23.
Log.e(
"log_tag"
,
"Error parsing data "
+e.toString());
24.
}
After this we only need to make up the Simple Adapter
01.
ListAdapter adapter =
new
SimpleAdapter(
this
, mylist , R.layout.main,
02.
new
String[] {
"name"
,
"magnitude"
},
03.
new
int
[] { R.id.item_title, R.id.item_subtitle });
04.
05.
setListAdapter(adapter);
06.
07.
final
ListView lv = getListView();
08.
lv.setTextFilterEnabled(
true
);
09.
lv.setOnItemClickListener(
new
OnItemClickListener() {
10.
public
void
onItemClick(AdapterView<?> parent, View view,
int
position,
long
id) {
11.
@SuppressWarnings
(
"unchecked"
)
12.
13.
Toast.makeText(Main.
this
,
"ID '"
+ o.get(
"id"
) +
"' was clicked."
, Toast.LENGTH_SHORT).show();
14.
15.
}
16.
});
Now we have a ListView filled with JSON data!
Không có nhận xét nào:
Đăng nhận xét