10天学安卓-第四天

原文:10天学安卓-第四天

继续昨天的学习。

昨天我们根据取得的天气数据新建了一个视图用来显示各项内容,那么今天我们就把数据显示出来吧!!!

这里我们要把数据和视图联系起来,那么就用到了适配器-Adapter,Android给我们提供了很多Adapter,这里我们用到了BaseAdapter。

BaseAdapter(1)

右键点击src/com.demo.weather,选择 New > Class,按照下图填写:

选择[Finish]后,我们就新建了一个BaseAdapter的子类,打开 WeatherAdapter.java这个文件,来解释一下这些代码,

public class WeatherAdapter extends BaseAdapter
{

    @Override
    public int getCount()
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Object getItem( int arg0 )
    {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId( int arg0 )
    {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView( int arg0, View arg1, ViewGroup arg2 )
    {
        // TODO Auto-generated method stub
        return null;
    }

}
public int getCount()

这个方法返回ListView有几条数据,

public Object getItem( int arg0 )

这个方法返回当前行的数据,

public long getItemId( int arg0 )

这个方法返回当前行的id,

public View getView( int arg0, View arg1, ViewGroup arg2 )

这个方法返回当前行的视图,

那么究竟怎样把数据和视图关联起来了。

首先,我们需要把取得的数据转换为代码可以方便操作的形式。把json数据转换为JavaBean,我们需要用到一个gson库,可以在这里下载。 http://code.google.com/p/google-gson/

把下载回来的gson-v2.jar放到libs文件夹,然后开始我们辛苦的工作吧,将是一大段代码。

Gson

新建一个package包,命名为com.demo.weather.bean,在这个包下面添加4个类,BaiduData、ResultsBean、IndexBean、WeatherDataBean,内容分别是:

public class BaiduData
{
    private int error;
    private String status;
    private String date;
    private List<ResultsBean> results;

    public int getError()
    {
        return error;
    }
    public void setError( int error )
    {
        this.error = error;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus( String status )
    {
        this.status = status;
    }
    public String getDate()
    {
        return date;
    }
    public void setDate( String date )
    {
        this.date = date;
    }
    public List<ResultsBean> getResults()
    {
        return results;
    }
    public void setResults( List<ResultsBean> results )
    {
        this.results = results;
    }
}
public class ResultsBean
{
    private String currentCity;
    private String pm25;
    private List<IndexBean> index;
    private List<WeatherDataBean> weather_data;

    public String getCurrentCity()
    {
        return currentCity;
    }
    public void setCurrentCity( String currentCity )
    {
        this.currentCity = currentCity;
    }
    public String getPm25()
    {
        return pm25;
    }
    public void setPm25( String pm25 )
    {
        this.pm25 = pm25;
    }
    public List<IndexBean> getIndex()
    {
        return index;
    }
    public void setIndex( List<IndexBean> index )
    {
        this.index = index;
    }
    public List<WeatherDataBean> getWeather_data()
    {
        return weather_data;
    }
    public void setWeather_data( List<WeatherDataBean> weather_data )
    {
        this.weather_data = weather_data;
    }
}
public class IndexBean
{
    private String title;
    private String zs;
    private String tipt;
    private String des;

    public String getTitle()
    {
        return title;
    }
    public void setTitle( String title )
    {
        this.title = title;
    }
    public String getZs()
    {
        return zs;
    }
    public void setZs( String zs )
    {
        this.zs = zs;
    }
    public String getTipt()
    {
        return tipt;
    }
    public void setTipt( String tipt )
    {
        this.tipt = tipt;
    }
    public String getDes()
    {
        return des;
    }
    public void setDes( String des )
    {
        this.des = des;
    }
}
public class WeatherDataBean
{
    private String date;
    private String dayPictureUrl;
    private String nightPictureUrl;
    private String weather;
    private String wind;
    private String temperature;

    public String getDate()
    {
        return date;
    }
    public void setDate( String date )
    {
        this.date = date;
    }
    public String getDayPictureUrl()
    {
        return dayPictureUrl;
    }
    public void setDayPictureUrl( String dayPictureUrl )
    {
        this.dayPictureUrl = dayPictureUrl;
    }
    public String getNightPictureUrl()
    {
        return nightPictureUrl;
    }
    public void setNightPictureUrl( String nightPictureUrl )
    {
        this.nightPictureUrl = nightPictureUrl;
    }
    public String getWeather()
    {
        return weather;
    }
    public void setWeather( String weather )
    {
        this.weather = weather;
    }
    public String getWind()
    {
        return wind;
    }
    public void setWind( String wind )
    {
        this.wind = wind;
    }
    public String getTemperature()
    {
        return temperature;
    }
    public void setTemperature( String temperature )
    {
        this.temperature = temperature;
    }
}

这4个JavaBean承载了json格式的字符串转换后的对象。

然后,打开MainActivity.java文件,这个文件还有一个小红叉,那是我们之前删掉了一个文本后没有及时修改代码造成的后果。不用客气,把它删掉。

修改http.send方法为以下内容:

        http.send( HttpMethod.GET, "http://api.map.baidu.com/telematics/v3/weather", params, new RequestCallBack<String>()
        {
            @Override
            public void onSuccess( ResponseInfo<String> responseInfo )
            {
                String weather = responseInfo.result;

                Gson gson = new Gson();
                BaiduData data = gson.fromJson( weather, BaiduData.class );

                Log.v( "onFailure", data.toString() );
            }

            @Override
            public void onFailure( HttpException arg0, String arg1 )
            {
                Log.v( "onFailure", arg1 );
            }
        } );

到这里,先搞一段落,来解释一下这么多的代码。

虽然代码很多,但是都很简单,BaiduData、ResultsBean、IndexBean、WeatherDataBean这4个类是根据gson的要求,结合百度天气API的返回数据做成的标准JavaBean。

                Gson gson = new Gson();
                BaiduData data = gson.fromJson( weather, BaiduData.class );

这两行是核心功能,把Json格式的字符串转换为了我们做成的BaiduData这个JavaBean。

BaseAdapter(2)

既然已经把数据格式化为JavaBean了,剩下的工作就简单多了。

修改WeatherAdapter使得数据和视图关联,

public class WeatherAdapter extends BaseAdapter
{
    private List<WeatherDataBean> weathers;
    private LayoutInflater inflater;
    private BitmapUtils bitmapUtils;

    public WeatherAdapter( Context context, List<WeatherDataBean> weathers )
    {
        this.weathers = weathers;
        inflater = LayoutInflater.from( context );
        bitmapUtils = new BitmapUtils( context );
    }

    @Override
    public int getCount()
    {
        return weathers.size();
    }

    @Override
    public Object getItem( int position )
    {
        return weathers.get( position );
    }

    @Override
    public long getItemId( int position )
    {
        return position;
    }

    @Override
    public View getView( int position, View convertView, ViewGroup parent )
    {
        convertView = inflater.inflate( R.layout.item_weather, null );

        TextView txtDate = (TextView)convertView.findViewById( R.id.item_date );
        TextView txtWeather = (TextView)convertView.findViewById( R.id.item_weather );
        TextView txtWind = (TextView)convertView.findViewById( R.id.item_wind );
        TextView txtTemperature = (TextView)convertView.findViewById( R.id.item_temperature );
        ImageView imgTemperature = (ImageView)convertView.findViewById( R.id.item_picture );

        WeatherDataBean bean = (WeatherDataBean)getItem( position );

        txtDate.setText( bean.getDate() );
        txtWeather.setText( bean.getWeather() );
        txtWind.setText( bean.getWind() );
        txtTemperature.setText( bean.getTemperature() );

        bitmapUtils.display( imgTemperature, bean.getDayPictureUrl() );

        return convertView;
    }

}

这里我们使用了LayoutInflater来载入昨天做成的item_weather界面,使用了BitmapUtils来加载网络图片。虽然是大段代码,但是道理很简单,把对应的数据显示到对应的项目。

然后,在MainActivity.java里添加对ListView以及我们之前建好的WeatherAdapter类的引用,并且将ListView、WeatherAdapter、BaiduData三个对象关联起来,

public class MainActivity extends Activity
{
    @ViewInject( R.id.weather_list )
    private ListView lstWeather;

    private WeatherAdapter adapter;
    private BaiduData data;

    private List<WeatherDataBean> datas;

    @Override
    protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );

        ViewUtils.inject( this );

        HttpUtils http = new HttpUtils();

        datas = new ArrayList<WeatherDataBean>();
        adapter = new WeatherAdapter( getApplicationContext(), datas );
        lstWeather.setAdapter( adapter );

        RequestParams params = new RequestParams();
        params.addQueryStringParameter( "location", "北京" );
        params.addQueryStringParameter( "output", "json" );
        params.addQueryStringParameter( "ak", "YknGmxIoPugT7YrNrG955YLS" );

        http.send( HttpMethod.GET, "http://api.map.baidu.com/telematics/v3/weather", params, new RequestCallBack<String>()
        {
            @Override
            public void onSuccess( ResponseInfo<String> responseInfo )
            {
                String weather = responseInfo.result;

                Gson gson = new Gson();
                data = gson.fromJson( weather, BaiduData.class );

                datas.clear();
                datas.addAll( data.getResults().get( 0 ).getWeather_data() );
                adapter.notifyDataSetChanged();

                Log.v( "onSuccess", data.toString() );
            }

            @Override
            public void onFailure( HttpException arg0, String arg1 )
            {
                Log.v( "onFailure", arg1 );
            }
        } );
    }
}

打完收工。

最终的效果如下:

同志们,很有成就感了吧!!!

不要得意,这只是把数据简单的显示出来而已,并且只能是帝都北京的数据,如果你不在北京,这根本对你一点用处都没有啊。

嗯嗯,今天就到这儿吧,已经足够多了,好学的你肯定已经在查找更多关于Adapter、ListView的知识了,这里我就不做介绍了,建议大家经常百度。

休闲一下,说点废话。

本人从事IT行业10余年,从最初级的菜鸟程序员开始,一步一步成长,见过形形色色的程序员,从个人的角度把程序员分成这么几个级别:

1. 无脑

这个指的是一遇到问题就问别人的同志,自己也不思考,也不求上进,混一天算一天。这种类型是极少数的,我也只是听说过,都是传说中的人物。

2. 菜鸟

这种类型的程序员非常多,通常是接触技术时间不长的朋友。这部分通常是没有网络就不能工作了,经常在论坛里查找资料,下载别人代码拿来使用,键盘上的Ctrl、C、V键都磨光了。

3. 小牛

这种类型多见于技术负责人、技术总监这样的职位,要想做到小牛这一步,需要对技术有比较深的了解,能够从无到有进行设计的。在各种开源社区,这部分人通常会比较活跃,菜鸟们大都使用小牛们的劳动成果。

4. 大牛

这种类型的人已经非常少了,我只见过那么几位,都是各大公司CTO之类的。说说其中一位,他从无到有设计了公司的云计算方案,从硬件的基础设施到软件层面,再到用户层面,这位大牛都有深入的掌握。

5. 传说

鄙人只能在各种新闻、书籍中才能见到了。个人认为这部分人的技术已经不是我们可以评判的了,他们的思想、影响力根本不是我等可以企及的。

各位亲,你是哪个级别的?

附件是本次的工程文件,点击下载

此系列文章系本人原创,如需转载,请注明出处 www.liuzhibang.cn

时间: 2024-12-16 13:44:21

10天学安卓-第四天的相关文章

10天学安卓系列

10天学安卓-第一天 摘要: 说明1:本系列教程仅针对新手入门,高手勿入!说明2:本系列教程均不考虑安卓版本低于4.0的情况.说明3:本系列教程假定您了解一些编程的基础知识,对于Java语言略懂即可.说点废话从什么时候说起呢,应该是很久以前的事情了.2008年的早春,因为工作的原因在日本工作了一个月,当我和同事们在商场闲逛的时候...阅读全文 posted @ 2015-01-17 15:15 Game_over 阅读(2755) | 评论 (9) 编辑 10天学安卓-第二天 摘要: 继续我们的

10天学安卓-第一天

原文:10天学安卓-第一天 说明1:本系列教程仅针对新手入门,高手勿入! 说明2:本系列教程均不考虑安卓版本低于4.0的情况. 说明3:本系列教程假定您了解一些编程的基础知识,对于Java语言略懂即可. 说点废话 从什么时候说起呢,应该是很久以前的事情了. 2008年的早春,因为工作的原因在日本工作了一个月,当我和同事们在商场闲逛的时候,发现了以前从未见过的电子设备,一款是大屏幕(当时可以称得上巨屏了)的手机,一款是超大容量(80G)的MP3,对了,也许聪明的你已经猜到了,一个是iPhone 1

10天学安卓-第三天

原文:10天学安卓-第三天 经过第二天的学习,我们正确的调用了百度天气API,将天气信息显示到了界面上,做到这一步,我们的工作就算是完成1%了,剩下99%的工作就需要不断的润色这个未成形的APP了. 最首要的就是,我们要把那么一大堆字符转换为普通用户可以轻松理解的界面,那么我们来学习一下Android里面的界面布局. 打开res/layout/activity_main.xml文件,切换到Layouts选项卡,可以看到里面有许多项目,GridLayout.LinearLayout.Relativ

10天学安卓-第五天

原文:10天学安卓-第五天 经过前几天的练习,相信大家已经对如何做出一个简单的界面有了初步的了解,并且已经做出来一个还不错的天气列表了. 今天大家稍事休息,要练习的内容比较少,着重学习一些理论知识,先理清几个概念. Android系统架构 Android系统本质上是Linux系统,但相对于Linux系统,主要在驱动.性能.内存管理.设备管理等一些部分做了比较多的改动,以更适用于移动设备. 从上图可以看到,Android系统架构为四层,分别是Linux内核.系统运行库.应用程序框架以及应用层,每一

10天学安卓-第二天

原文:10天学安卓-第二天 继续我们的学习. 相信我,第一天的工作是最为重要的,通过这些工作,我们把开发安卓所必须的环境.基础条件都配置好了,相信肯定遇到了很多问题,不过,根据我的经验,您会很快解决这些问题的.在第一天的最后,我们终于运行了第一个应用->“Hello, world”. 理论知识 下面我们学习一些理论知识,了解一下安卓系统的架构.组件,有了一些基础知识,才不会感觉迷惑. 先看下整个项目的目录,每个目录都有特定的作用,分别如下: src目录,存放源代码文件. gen目录,由ADT插件

10天学安卓-第八天

昨天郑州雨夹雪,还有冰雹,结果小区就断电了,真是悲剧.第八天的学习就挪到今天了. 经过前几天的学习,我们了解了一些Android的基础知识,并且做出了一个也算实用的天气预报APP,对Android也算得上是入门了,那么今天我们继续改进我们的APP. 这个APP现在只能查看所在城市的天气,那么万一妹子不跟我们一个城市,我们就不能关注到妹子所在城市的天气了,那还怎么嘘寒问暖呢,这个问题是一定要解决的. 如何解决? 那就是需要在一个界面上可以选择城市了,这就用到了数据库了. 我整理了一份所有城市的名单

10天学安卓-第十天

本次是这个教程的最后一篇了,我们的APP开发基本上已经可以宣告完成了,接下来的工作就是如何发布推广运营了. 广告平台 古人云:兵马未动,粮草先行.我们身为APP开发者就需要考虑如何从APP盈利,目前通常的做法主要有APP收费.APP免费+内购及嵌入广告三种方式,我们这个简单的APP想让用户付费是比较有难度的,那么就只能通过嵌入广告的方式来赚取一点广告费了. 我经常使用的广告平台就是Admob了,不过Admob国内被屏蔽,但是广告依然可以展示,各位程序员一定要学习科学上网,否则... 话说回来,国

10天学安卓-第七天

我们上次学习了百度定位以及SharedPreferences的使用,不知道大家有没有注意到我们新加了一个方法: protected void onStop() { super.onStop(); mLocationClient.stop(); } 这个方法的作用是在界面停止的时候,同时停止百度定位功能. 联想到我们还有onCreate,那么这两个方法是做什么用的?是什么原理呢? 这就需要我们来了解一下Activity的生命周期. Activity生命周期 Activity的整个生命周期有七个重要

10天学安卓-第六天

经过前几天的学习,我们的天气预报程序已经可以把天气正常的呈现出来了,正如之前说的,现在的APP只能显示固定地区的天气,那么我们要怎样才能显示我们本身所在地的天气呢? Android定位 Android系统本身提供了三种定位方式,分别是网络.基站和GPS,主要利用的是LocationManager.TelephonyManager相关的类库,但是因为一些原因,Google的API在国内访问经常出现问题,所以在这里我就不对这些API做介绍了,有想了解的可以自行查询相关资料. 百度地图定位 除了And