昨天介绍了基本的载入界面,今天介绍下天气信息显示界面的代码

  1. 基本ListView显示
  2. 搜索框,查询城市

上一篇文章中,载入界面通过showWeatherInfo()方法跳转到天气信息显示界面

    private void showWeatherInfo() {
Bundle bundle = new Bundle();//bundle用来传递weatherinfolist
bundle.putSerializable(Utils.WEATHERINFO, (Serializable) weatherInfoList);
Intent intent = new Intent(MyActivity.this, MainActivity.class);
//跳转到MainActivity
intent.putExtra(Utils.WEATHERINFO, bundle);
startActivity(intent);
finish();//结束当前Activity
}

如下是用于显示天气信息的MainActivity的内容,注意注释

public class MainActivity extends Activity {

    //定义TAG是用来打Log的
private static final String TAG = "MyActivity";
private ListView mListView;//ListView用来显示天气信息
private WeatherAdapter mWeatherAdapter;//ListView对应的Adapter
private EditText mSearchEt;//搜索框 private ArrayList<WeatherInfo> weatherInfoList;//全部天气信息List
private ArrayList<WeatherInfo> resultList;//根据搜索框输入的内容显示的结果List /**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main);
resultList = new ArrayList<WeatherInfo>(); Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra(Utils.WEATHERINFO);//获取Intent中携带的信息
weatherInfoList = (ArrayList<WeatherInfo>) bundle.getSerializable(Utils.WEATHERINFO);
Log.e(TAG, "weatherinfo = " + weatherInfoList.toString()); mSearchEt = (EditText) findViewById(R.id.et_search);
mListView = (ListView) findViewById(R.id.lvView);
mWeatherAdapter = new WeatherAdapter(this, weatherInfoList);
mListView.setAdapter(mWeatherAdapter); //设置TextWathcer()根据输入框的文本变化显示不同的list
mSearchEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
} @Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
} @Override
public void afterTextChanged(Editable editable) {
resultList.clear();
String searchstr = mSearchEt.getText().toString();
if(searchstr==null) {
mWeatherAdapter.setWeatherInfoList(weatherInfoList);
mWeatherAdapter.notifyDataSetChanged();
} else {
for (int i = 0; i < weatherInfoList.size(); i++) {
String cityname = weatherInfoList.get(i).getCity();
if (cityname.contains(searchstr) || searchstr.contains(cityname)) {
resultList.add(weatherInfoList.get(i));
}
}
//更新Adatper对应的数据
mWeatherAdapter.setWeatherInfoList(resultList);
mWeatherAdapter.notifyDataSetChanged();
}
}
});
}
}

看看WeatherAdapter的代码,WeatherAdapter继承BaseAdapter

//继承BaseAdapter,需要复写几个方法
public class WeatherAdapter extends BaseAdapter {
private static final String TAG = "WeatherAdapter";
private Context context;
private List<WeatherInfo> weatherInfoList; public WeatherAdapter(Context context, List<WeatherInfo> weatherInfoList) {
this.context = context;
this.weatherInfoList = weatherInfoList;
} @Override
public int getCount() {
return weatherInfoList.size();
}//list的size @Override
public WeatherInfo getItem(int i) {
return weatherInfoList.get(i);
}//获取天气信息 @Override
public long getItemId(int i) {
return i;
}//获取Item的id @Override
public View getView(int i, View view, ViewGroup viewGroup) {
//这个方法比较关键,返回Item view
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.listviewitem, null);
} ImageView weatherimage = (ImageView) view.findViewById(R.id.weatherimage);
TextView cityname = (TextView) view.findViewById(R.id.cityname);
TextView temp = (TextView) view.findViewById(R.id.temp);
TextView weather = (TextView) view.findViewById(R.id.weather); WeatherInfo weatherInfo = weatherInfoList.get(i);
cityname.setText(weatherInfo.getCity());
temp.setText(weatherInfo.getTemp1() + " ~ " + weatherInfo.getTemp2());
String weatherstr = weatherInfo.getWeather();
weather.setText(weatherstr);
//这里大致使用几个图片,具体做法,不同的json数据查询api中应该可以查询到支持的天气种类,根据查询到的种类设置不用的图片,这里暂且只分为4种,避免我的apk界面太丑 不忍直视
if(weatherstr.contains("雨")) {
weatherimage.setImageResource(R.drawable.rain);
} else if(weatherstr.contains("阴")) {
weatherimage.setImageResource(R.drawable.yin);
} else if(weatherstr.contains("云")) {
weatherimage.setImageResource(R.drawable.cloud);
} else if(weatherstr.contains("雪")) {
weatherimage.setImageResource(R.drawable.snow);
} else {
weatherimage.setImageResource(R.drawable.sun);
}
return view; }
//方便替换List
public void setWeatherInfoList(List<WeatherInfo> list) {
this.weatherInfoList = list;
}
}

基本效果图:(录屏大师录屏)

源代码下载路径:

http://download.csdn.net/detail/poorkick/9510243

缺陷:

1. 每次进入需要载入数据,可以替换成根据时间戳判断是否数据有更新,当然这个对查询借口有点依赖,本地通过数据库存储当前信息

2. 天气信息由于使用的是气象台的,数据更新自己本身无法掌握,可以替换成其他查询接口

3. 后续可能会再做一个更完善的天气预报应用,采用新的查询接口和UI界面

界面简陋,代码不完善,见谅,工作之余练手之作。

<Android 应用 之路> 天气预报(三)的更多相关文章

  1. <Android 应用 之路> 天气预报(五)

    前言 写了上一篇文章,讲了下这个实现天气预报的使用内容,现在又到了看代码的时候,主要还是贴代码,然后添加足够的注释. 聚合数据SDK配置 将juhe_sdk_v_X_X.jar以及armeabi文件夹 ...

  2. <Android 应用 之路> 天气预报(四)

    前言 第二次尝试完成天气预报应用,与上次不同的是,个人感觉这次的Ui不那么丑陋,整体的实用性和界面效果,用户体验相较上一次有所提升,但是还是有很多地方需要完善. 这次使用到的内容比较丰富,包括聚合数据 ...

  3. <Android 应用 之路> 天气预报(一)

    Android天气预报客户端 设计思路 欢迎界面,版本号,应用名 + 数据后台加载(所有城市的信息获取) 数据加载完成后跳转到显示界面,显示所有查询到的城市的天气信息 欢迎界面和天气显示界面分别为单独 ...

  4. <Android 应用 之路> 天气预报(二)

    界面组成 载入界面 显示界面 Activity两个,一个用来显示载入界面,一个用来显示天气信息 主要代码如下: public class MyActivity extends Activity { p ...

  5. Android学习之路——简易版微信为例(一)

    这是“Android学习之路”系列文章的开篇,可能会让大家有些失望——这篇文章中我们不介绍简易版微信的实现(不过不是标题党哦,我会在后续博文中一步步实现这个应用程序的).这里主要是和广大园友们聊聊一个 ...

  6. ❤️【Android精进之路-01】定计划,重行动来学Android吧❤️

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. Android精进之路第一篇,确定安卓学习计划. 干货满满,建议收藏,需要用到时常看看.小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~. 前言 ...

  7. redis成长之路——(三)

    redis连接封装 StackExchange.Redis中有一些常功能是不在database对中,例如发布订阅.获取全部key(本代码中已封装到operation中了)等,而且StackExchan ...

  8. Android实现全屏的三种方式

    一.通过代码 requestWindowFeature(Window.FEATURE_NO_TITLE);// 隐藏标题栏 getWindow().setFlags(WindowManager.Lay ...

  9. Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

随机推荐

  1. 七 vue学习 async/await

    1:  javaScript async/await: 调用async函数的时候,是异步的,函数后面的代码继续执行.! async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解 ...

  2. spring boot 学习三:OAuth2 认证

    1:  代码地址: https://github.com/liufeiSAP/uaa-zuul 2:     安装: postgres 下载 https://www.openscg.com/bigsq ...

  3. stm32之复位与待机唤醒

    一.复位 stm32复位有三种类型,分别为系统复位.电源复位和备份域复位. 其中系统复位又分为: NRST引脚低电平(外部复位) 窗口看门狗计数结束 独立看门狗计数结束 软件复位 低功耗管理复位 二. ...

  4. [hdu3586]Information Disturbing树形dp+二分

    题意:给出一棵带权无向树,以及给定节点1,总约束为$m$,找出切断与所有叶子节点联系每条边所需要的最小价值约束. 解题关键:二分答案,转化为判定性问题,然后用树形dp验证答案即可. dp数组需要开到l ...

  5. Acdream手速赛7

    蛋疼啊,本次只做出了一道题目...渣爆了... 妈蛋,,卡题之夜..比赛结果是1道题,比赛完哗啦哗啦出4道题.. A acdream1191 Dragon Maze 题意: 给一个迷宫,给出入口坐标和 ...

  6. 2.6用tr进行转换

    tr可以对来自标准输入的内容进行字符替换.字符删除以及重复字符压缩.它可以将一组字符变成另一组字符,因而通常也被称为转换命令. 1.tr只能通过stdin(标准输入),而无法通过命令行参数来接受输入. ...

  7. select2,利用ajax高效查询大数据列表(可搜索、可分页)

    二.导入css和js到网站上 1.使用CDN,节省自己网站的流量 ? 1 2 <link href="https://cdnjs.cloudflare.com/ajax/libs/se ...

  8. 3分钟简单了解 prototype 和 __proto__

    关于prototype 1. 所有的函数都会有一个prototype属性,属性值是一个普通对象: 2. 当我们去new一个构造函数的实例时,构造函数的原型对象(prototype)会被赋值给它实例的[ ...

  9. 从零开始学Docker

    在写这篇博客之前,听说过Docker技术,但是一直没有主动去深入了解.用这篇博客来记录自己学习Docker的个人总结,会一直补充完善. 我这边先随便写,后期再做总结!! Docker官网: https ...

  10. NET中并行开发优化

    NET中并行开发优化 让我们考虑一个简单的编程挑战:对大数组中的所有元素求和.现在可以通过使用并行性来轻松优化这一点,特别是对于具有数千或数百万个元素的巨大阵列,还有理由认为,并行处理时间应该与常规时 ...