zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    IDEA、Eclipse快捷键对比
    linux常见命令
    拷贝本地文件到远程服务器的批处理脚本
    关系型数据库的超键、候选键、主键
    JAVA运算符总结
    JAVA原码反码补码
    JPA查询语句(转载)
    Spring Data JPA初使用(转载)
    android学习————项目导入常见错误整理(转载)
    Spring 系列: Spring 框架简介
  • 原文地址:https://www.cnblogs.com/hxxy2003/p/2602962.html
Copyright © 2011-2022 走看看