json解析到listview


本文參與:Testin—安卓巴士Android開發原創教程大賽

本項目是使用愛幫公交提供的SDK作為我們開發的基礎,通過輸入公交路線,發送到遠程服務器,接着遠程服務器返回一個json格式的結果數據,我再將這個json格式的結果數據解析到listview控件里。

(1)首先先去申請API KEY, 愛幫的API的網址:http://www.aibang.com/api/


<ignore_js_op>1.jpg 

(2)了解下愛幫API,愛幫返回的數據有兩種格式,一種是xml,另一種是json,這次只是講json的解析,這次實現的功能模塊是“公交線路查詢”

來了解一個url:http://openapi.aibang.com/bus/lines?app_key=f41c8afccc586de03a99c86097e98ccb&city=%E5%B9%BF%E5%B7%9E&q=b25

將這條url放在瀏覽器里訪問,將會返回如下的數據:

<ignore_js_op>2.jpg 

顯然上面的是xml格式的數據,只要在url后面加上"&alt=json",即可返回json格式的數據。

這條url的參數說明如下:


<ignore_js_op>7.jpg 

返回的數據的說明:

<ignore_js_op>8.jpg 


詳細請查看 :http://www.aibang.com/api/usage#bus_lines

(3)下載愛幫公交SDK,解壓后有兩個文件夾,一個是sdk,一個是demo,公交線路查詢模塊就參考了一下demo,sdk文件夾下的apidoc里面的api說明文檔是我們要經常看的。sdk文件夾下的lib文件夾下有個aibang-android-open-sdk-1.0.0.jar 包,我們等會新建項目時要把這個jar包導進去的,另外還要去下載httpmime-4.2.1.jar這個jar包。

(4)新建一個項目,我將其命名為MyAiBang1.0,如下圖所示:
<ignore_js_op>3.jpg 
file:///C:/Users/Administrator/AppData/Local/youdao/ynote/images/0460029C43F549E799224E54F04E1E8E/3.jpg

(5)建議大家先導入項目運行起來,玩下就明白了,現在也先演示下:

        運行軟件起來,並輸入要查詢的路線如下:

     <ignore_js_op>4.jpg 

     點擊查詢,便查出與25號線相關的公交路線(數據解析后填充在一個ListView控件里):

   <ignore_js_op>5.jpg 

    再點擊其中一條路線,如點擊b25路,便跳轉到另一個Activity,如下:

   <ignore_js_op>6.jpg 

(6)看看返回的數據,像result_num、web_url等我是用不到的,我能用到的只有name、info、stats三個字段,所以我在com.myaibang.domain包下新建一個Line類,如下:

public class Line {
        private String name;
        private String info;
        private String stats;
        public Line(String name, String info, String stats) {
                this.name = name;
                this.info = info;
                this.stats = stats;
        }
        public Line() {
        }
        //省略getter和setter方法
}


(7)新建一個Activity,我將其命名為RouteActivity,對應下面兩個頁面:

<ignore_js_op>4.jpg      <ignore_js_op>5.jpg 


請對應代碼聽我講解,哈。

在RouteActivity里建一個內部類AibangAsyncTask,如下:

private class AibangAsyncTask extends AsyncTask<Void, Void, JSONObject>

這個主要參考下載的sdk里的demo,關於AsyncTask,大家可以網上找下相關資料看看,因為這節主要是講json的解析,所以略過。

private static final String API_KEY="766cb8dbbdb7fba92de17f0b2d88745b";  API_KEY,大家懂的,用剛剛申請的。

mAibang=new AibangApi(API_KEY);  初始化,默認是返回json格式的數據。

routeData=editText.getText().toString();  這個是獲取輸入框里輸入的路線的數據。

result=mAibang.busLines("廣州", routeData, 0);  這里我是寫死城市是廣州的,result就是返回的數據,是json格式的。

JSONObject jsonObject=new JSONObject(result);
                        
String lines=jsonObject.getString("lines");
                        
JSONObject jsonObject2=new JSONObject(lines);


String line=jsonObject2.getString("line");

JSONArray jsonArray=new JSONArray(line);  通過LogCat可以查看到line返回的是數組,所以我將其初始化為一個json數組


List<String> data = new ArrayList<String>(); 
        
List<Line> list=new ArrayList<Line>();  


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

                                jsonObject2=jsonArray.getJSONObject(i);
                                String name=jsonObject2.getString("name");
                                String info=jsonObject2.getString("info");
                                String stats=jsonObject2.getString("stats");

                                list.add(new Line(name,info,stats));
                                
                                data.add(name);
                                
                        }   通過遍歷,解析json格式的數據,data的數據添加到當前的ListView里面。


listView.setAdapter(new ArrayAdapter<String>(RouteActivity.this, android.R.layout.simple_expandable_list_item_1,data)); 這句不用解釋了吧,呵!就是將數據添加到ListView顯示出來。

//intent將數據傳到RouteResultActivity
Intent intent=new Intent(RouteActivity.this,RouteResultActivity.class);
intent.putExtra("resultData", list.get(arg2).getStats()); 我要的是各個站點的數據。
startActivity(intent);
overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out);一個過渡的動畫,不錯的例子來的,可以參考用到其他項目中去。



(8)新建名為RouteResultActivity的類,顯示線路的各個站點

Intent intent=getIntent();
String value=intent.getStringExtra("resultData");  獲取RouteActivity傳過來的值。


點擊B25,通過LogCat查看返回的值如下:

體育中心;石牌橋(BRT);崗頂(BRT);師大暨大(BRT);華景新城(BRT);上社(BRT);學院(BRT);科韻路;琶洲大橋北;北山;星海學院[大學城];華師[大學城];廣大[大學城];廣大生活區[大學城];廣大公寓[大學城];大學城總站[中部樞紐]

List<String> data = new ArrayList<String>();  將解析的以上的數據一個個添加到data里。

解析的思想:主要是通過“;”,如下:

int j=0;

for(int i=0;i<value.length();i++){

                        if(value.charAt(i)==';'){
                                infoData=value.substring(j,i);
                                Log.v(TAG, "返回的infoData值為"+infoData);
                                j=i+1;
                                data.add(infoData);
                        }

                        if(i==value.length()-1){
                                infoData=value.substring(j,i+1);
                                Log.v(TAG, "返回的infoData值為"+infoData);
                                data.add(infoData);
                        }
                
                }


listView2.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,data)); 顯示出來了。


(9)json格式的數據解析其實很簡單,關鍵要看好那個格式是如何組成的,有沒有數組。有一個網站,格式化json格式挺不錯的,介紹一下:http://jsonformatter.curiousconcept.com/

(10)除了解析json數據這塊之外,本項目的首頁淡入淡出的效果、兩個Activity之間的跳轉動畫、底部tabhost導航菜單,這些在實戰應用中也是常用到的,需要的話可以參考一下,對本文有疑問的可以找我。我的郵箱是262821820@qq.com,大家一起共同探討吧!哈。

 

源碼下載: <ignore_js_op> MyAiBang1.0.zip 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM