咱們知道,手機上信息的顯示與更新,均來自於網絡中的服務器等。而像新浪這樣對外開放接口,咱們根據接口的規範等得到咱們想要的數據,這時就須要咱們運用網絡通訊的知識,去得到他返回給咱們的字串,咱們每每獲得的是想JSON等這樣的字串,咱們要把它解析出來,得到數據位咱們所用。
html
這裏咱們採用的是HttpClient的網絡通訊方式,得到存在於服務器中的JSON字符串,經過解析,獲得數據,並經過適配器,適配到ListView控件上。
java
◆具體操做:
json
(1)咱們搭建一個服務器,並扔裏面一個json格式的文件,打開服務器,等待鏈接。這裏我用到的JSON數據文件爲數組
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> {"statuses": [ {"calendar_id":"1705","title":"(\u4eb2\u5b50)ddssd","category_name":"\u9ed8\u8ba4\u5206\u7c7b","showtime":"1288927800","endshowtime":"1288931400","allDay":false,"user":{"id":1222}}, {"calendar_id":"1706","title":"(\u65c5\u884c)","category_name":"\u9ed8\u8ba4\u5206\u7c7b","showtime":"1288933200","endshowtime":"1288936800","allDay":false,"user":{"id":1222}} ] } |
(2)先編寫程序,得到服務器中JSON文件中的內容,以String的形式讀取。(這裏我直接給出源碼,如有不明白之處,可參見上一篇博文)服務器
//實例化數據請求對象 httpGet = new HttpGet( "http://222.27.166.10:8080/MyServer/jsonindex.jsp"); httpClient = new DefaultHttpClient();//實例化客戶端對象 httpResponse = httpClient.execute(httpGet);//實例化響應對象 httpEntity = httpResponse.getEntity();//得到響應中的數據並存儲 in = httpEntity.getContent();//得到數據內容 BufferedReader br = new BufferedReader(new InputStreamReader(in));//讀取流 String line = null; StringBuffer sb = new StringBuffer(); while ((line = br.readLine()) != null) { sb.append(line);//此時的sb中的內容其實就是JSON形式的字符串 } |
(3)編一個方法,解析JSON字符串。這裏面涉及到一個數組,每個JSON對象也能夠是幾個JSON對象的集合,咱們把這個承載JSON對象的集合叫作JSON數組,數組的解析用到了JSONArray,經過json對象的get(由JSON數組組成的JSON對象的鍵名)來得到。具體以下
網絡
//JSON字符串的解析,我在前面的博文中也有講解 public List<HashMap<String, Object>> parseJSON(String str) { List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>(); HashMap<String, Object> map ; try { JSONObject json = new JSONObject(str);//根據傳入的的字符串得到JSON對象昂 JSONArray js = (JSONArray) json.get("statuses");//經過鍵得到JSON數組 for (int i = 0; i < js.length(); i++) {//循環數組讀取數據 map = new HashMap<String, Object>(); JSONObject jo = (JSONObject) js.get(i);//每個數組又是一個JSON對象 map.put("calendar_id", jo.getString("calendar_id"));//數據的存儲 map.put("title", jo.getString("title")); map.put("category_name", jo.getString("category_name")); map.put("showtime", jo.getString("showtime")); map.put("endshowtime", jo.getString("endshowtime")); map.put("allDay", jo.getBoolean("allDay")); JSONObject joo = jo.getJSONObject("user");//這裏又嵌套了一個JSON對象 map.put("id", joo.getString("id")); list.add(map);//添加數據到List中 } } catch (JSONException e) { e.printStackTrace(); } return list;//返回存儲數據的list } |
(4)聲明,並實例化ListView及適配器,完成適配。(這裏的代碼,應直接跟着第二個操做後邊寫出)
app
//給數據源賦值並強制轉換 list = (ArrayList<HashMap<String, Object>>) parseJSON(sb .toString()); //實例化適配器,進行數據的存儲 //這裏的new String中的數據爲JSON中的鍵名稱,new int中的爲自定義佈局中控件的ID //因爲這裏的JSON數據已經獲得,經過輸出,能夠看出每個JSON對象共7條數據,因此這裏用7 //個控件去承載數據 adpater = new SimpleAdapter(this, list, R.layout.cell, new String[]{ "calendar_id","title","category_name","showtime","endshowtime","allDay","id" }, new int[]{R.id.textView1,R.id.textView2,R.id.textView3,R.id.textView4, R.id.textView5,R.id.textView6,R.id.textView7}); //適配Listview lv.setAdapter(adpater); |