json解析到listview

来源:互联网 发布:淘宝店推广平台 编辑:程序博客网 时间:2024/05/17 05:06
本项目是使用爱帮公交提供的SDK作为我们开发的基础,通过输入公交路线,发送到远程服务器,接着远程服务器返回一个json格式的结果数据,我再将这个json格式的结果数据解析到listview控件里。

(1)首先先去申请API KEY, 爱帮的API的网址:http://www.aibang.com/api/




(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放在浏览器里访问,将会返回如下的数据:



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

这条url的参数说明如下:




返回的数据的说明:




详细请查看 :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,如下图所示:

file:///C:/Users/Administrator/AppData/Local/youdao/ynote/images/0460029C43F549E799224E54F04E1E8E/3.jpg

(5)建议大家先导入项目运行起来,玩下就明白了,现在也先演示下:

        运行软件起来,并输入要查询的路线如下:

     


     点击查询,便查出与25号线相关的公交路线(数据解析后填充在一个ListView控件里):

   


    再点击其中一条路线,如点击b25路,便跳转到另一个Activity,如下:

   


(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,对应下面两个页面:

     



请对应代码听我讲解,哈。

在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,大家一起共同探讨吧!哈。

源码下载:  MyAiBang1.0.zip (1.49 MB, 下载次数: 237) 
原创粉丝点击