实验三 综合示例设计与开发-“天气预报服务”软件
一、实验目的
(1)理解Android 软件开发从准备策划工作开始到软件发布全过程;
(2)掌握使用多种组件进行Android程序开发的方法。
二、实验环境
(1) 硬件:PC 机,其它相关硬件 ;
(2)软件:Windows XP,Android Studio集成开发环境,Android Development Tools插件。
三、实验内容及 要求
(1)实现“天气预报服务”软件的开发与测试。
四、实验步骤
解决问题的思路:
实时天气数据从哪来?
有了数据来源后如何获取?
获取到的数据格式如何解析?
如何在Android平台下呈现?
具体说明:
1、 实时天气数据从哪来?
接口用的百度的天气接口
http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=yourkey
2、 有了数据来源后如何获取?
Apache HttpClient:
Apache HttpClient是一个兼容HTTP/1.1的HTTP代理实现,提供了可重用的组件,客户端认证,HTTP状态管理,HTTP连接管理。
3、 获取到的数据格式如何解析?
通过HttpClient访问WebXml服务器,返回的数据是一个XML格式的字符串,那么我们应该如何处理这个XML呢?
1) 使用DOM技术解析
2) 使用SAX技术解析
3) 使用PULL技术解析
XmlPull(http://www.xmlpull.org/)
Android平台集成了XmlPull组件
XmlPull的原理实现与SAX原理相似,为事件驱动。
XmlPull中把事件分为不同的类型标记:
— START_DOCUMENT 0
— END_ DOCUMENT 1
— START_TAG 2
— END_TAG 3
— TEXT 4
4、 如何在Android平台下呈现?
通过XmlPull组件我们把xml数据已可以很方便的解析出来,放入一个List集合中,下面我们将利用Android UI组件把List的相关内容呈现在屏幕上。
我们将使用以下UI组件:
TextView
ImageView
Button
LinnerLayout
1、 界面设计
城市用spinner控件实现选择。效果如下图所示:
界面代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg2"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Spinner
android:id="@+id/spinner1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<Spinner
android:id="@+id/spinner2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_weight="1" />
<Spinner
android:id="@+id/spinner3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:id="@+id/index"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/tvCity"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_weight="1" />
<TextView
android:id="@+id/tvPM25"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_weight="1" />
<TextView
android:id="@+id/tvDate"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/lyWeather1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_weight="1"
android:orientation="vertical" >
<TextView
android:id="@+id/tvweek1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvwea1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<ImageView
android:id="@+id/ivpic11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<ImageView
android:id="@+id/ivpic12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvwind1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvtemper1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/lyWeather2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_weight="1"
android:orientation="vertical" >
<TextView
android:id="@+id/tvweek2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvwea2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<ImageView
android:id="@+id/ivpic21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<ImageView
android:id="@+id/ivpic22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvwind2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvtemper2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/lyWeather3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_weight="1"
android:orientation="vertical" >
<TextView
android:id="@+id/tvweek3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvwea3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<ImageView
android:id="@+id/ivpic31"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<ImageView
android:id="@+id/ivpic32"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvwind3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/tvtemper3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
2、 城市列表数据设置
在res文件夹下新建raw文件夹,并在文件夹下新建citys_weather.xml文件,实现全国城市列表信息。
3、 封装各信息类
1)其中City.java文件实现城市信息的封装,代码如下:
public class City {
private String id;
private String name;
private List<District> disList;
public City() {
}
public City(String id, String name, List<District> disList) {
super();
this.id = id;
this.name = name;
this.disList = disList;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<District> getDisList() {
return disList;
}
public void setDisList(List<District> disList) {
this.disList = disList;
}
@Override
public String toString() {
return name;
}
}
**2)District.java文件实现市区信息封装,代码如下:
public class District {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
3)Province.java文件实现省份信息封装,代码如下:
public class Province {
private String id;
private String name;
private List<City> citys;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<City> getCitys() {
return citys;
}
public void setCitys(List<City> citys) {
this.citys = citys;
}
@Override
public String toString() {
return name;
}
}
4)Index.java文件实现天气索引信息的封装,代码如下:
public class Index {
private String title;
private String zs;
private String tipt;
private String des;
public Index() {
}
public Index(String title, String zs, String tipt, String des) {
this.title = title;
this.zs = zs;
this.tipt = tipt;
this.des = 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;
}
@Override
public String toString() {
return "{des:" + des + ", tipt:" + tipt + ", title:" + title + ", zs:"
+ zs + "}";
}
}
5)Result.java文件实现当前选择城市的天气信息的封装,代码如下:
public class Result {
private String currentCity;
private String pm25;
private List<Index> index;
private List<Weather_data> weather_data;
public Result() {
}
public Result(String currentCity, String pm25, List<Index> index,
List<Weather_data> weatherData) {
this.currentCity = currentCity;
this.pm25 = pm25;
this.index = index;
weather_data = weatherData;
}
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<Index> getIndex() {
return index;
}
public void setIndex(List<Index> index) {
this.index = index;
}
public List<Weather_data> getWeather_data() {
return weather_data;
}
public void setWeather_data(List<Weather_data> weatherData) {
weather_data = weatherData;
}
@Override
public String toString() {
return "{currentCity:" + currentCity + ", index:" + index + ", pm25:"
+ pm25 + ", weather_data:" + weather_data + "}";
}
}
6)Weather_data.java文件实现天气数据信息的封装,代码如下:
public class Weather_data {
private String date;
private String dayPictureUrl;
private Bitmap dayPicture;
private String nightPictureUrl;
private Bitmap nightPicture;
private String weather;
private String wind;
private String temperature;
public Weather_data() {
}
public Weather_data(String date, String dayPictureUrl,
String nightPictureUrl, String weather, String wind,
String temperature) {
this.date = date;
this.dayPictureUrl = dayPictureUrl;
this.nightPictureUrl = nightPictureUrl;
this.weather = weather;
this.wind = wind;
this.temperature = temperature;
}
public Bitmap getDayPicture() {
return dayPicture;
}
public void setDayPicture(Bitmap dayPicture) {
this.dayPicture = dayPicture;
}
public Bitmap getNightPicture() {
return nightPicture;
}
public void setNightPicture(Bitmap nightPicture) {
this.nightPicture = nightPicture;
}
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;
}
@Override
public String toString() {
return "{date:" + date + ", dayPictureUrl:" + dayPictureUrl
+ ", nightPictureUrl:" + nightPictureUrl + ", temperature:"
+ temperature + ", weather:" + weather + ", wind:" + wind + "}";
}
}
6)Weather.java文件实现其他信息的封装,代码如下:
public class Weather {
private String error;
private String status;
private String date;
private List<Result> results;
public Weather() {
}
public Weather(String error, String status, String date,
List<Result> results) {
this.error = error;
this.status = status;
this.date = date;
this.results = results;
}
public String getError() {
return error;
}
public void setError(String 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<Result> getResults() {
return results;
}
public void setResults(List<Result> results) {
this.results = results;
}
@Override
public String toString() {
return "{date:" + date + ", error:" + error + ", results:" + results
+ ", status:" + status + "}";
}
}
4、 数据获取与解析
HttpUtils文件实现数据获取与解析,代码如下:
public class HttpUtils {
public static String getURl(String location) {
String url = "http://api.map.baidu.com/telematics/v3/weather?location="
+ location + "&output=json&ak=B95329fb7fdda1e32ba3e3a245193146";
return url;
}
public static String getJsonStr(String url) {
HttpGet get = new HttpGet(url);
HttpClient client = new DefaultHttpClient();
HttpResponse response;
try {
response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
InputStream in = response.getEntity().getContent();
return getResult(in);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static Bitmap getImage(String imageUrl) {
HttpGet get = new HttpGet(imageUrl);
HttpClient client = new DefaultHttpClient();
HttpResponse response;
try {
response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200) {
InputStream in = response.getEntity().getContent();
Bitmap bm = BitmapFactory.decodeStream(in);
return bm;
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static String getJsonStr2(String url) {
URL url2 = null;
try {
url2 = new URL(url);
} catch (MalformedURLException e1) {
e1.printStackTrace();
}
HttpURLConnection conn;
try {
conn = (HttpURLConnection) url2.openConnection();
conn.setDoInput(true);
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {
InputStream in = conn.getInputStream();
return getResult(in);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private static String getResult(InputStream in) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len = 0;
try {
while ((len = in.read(b)) != -1) {
bos.write(b, 0, len);
bos.flush();
}
// System.out.println(new String(bos.toByteArray(), "utf-8"));
return new String(bos.toByteArray(), "utf-8");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static Weather fromJson2(String jsonStr) {
// Weather obj = JSON.parseObject(jsonStr, Weather.class);
// return obj;
return null;
}
public static Weather fromJson(String jsonStr) {
try {
JSONObject obj = new JSONObject(jsonStr);
String error = obj.getString("error");
String status = obj.getString("status");
String date = obj.getString("date");
// 根据具体的error值返回不同的信息,这儿做了统一处理,返回null;
if (Integer.parseInt(error) != 0) {
return null;
} else {
Weather wea = new Weather();
wea.setError(error);
wea.setStatus(status);
wea.setDate(date);
// results信息
List<Result> results = new ArrayList<Result>();
JSONArray rArr = obj.getJSONArray("results");
for (int i = 0; i < rArr.length(); i++) {
JSONObject rObj = rArr.getJSONObject(i);
Result res = new Result();
res.setCurrentCity(rObj.getString("currentCity"));
res.setPm25(rObj.getString("pm25"));
// index信息
List<Index> index = new ArrayList<Index>();
JSONArray iArr = rObj.getJSONArray("index");
for (int j = 0; j < iArr.length(); j++) {
JSONObject iObj = iArr.getJSONObject(i);
Index ind = new Index();
ind.setTitle(iObj.getString("title"));
ind.setZs(iObj.getString("zs"));
ind.setTipt(iObj.getString("tipt"));
ind.setDes(iObj.getString("des"));
index.add(ind);
}
res.setIndex(index);
// weather_data信息
List<Weather_data> weather_data = new ArrayList<Weather_data>();
JSONArray wArr = rObj.getJSONArray("weather_data");
for (int j = 0; j < wArr.length(); j++) {
JSONObject wObj = wArr.getJSONObject(j);
Weather_data wd = new Weather_data();
wd.setDate(wObj.getString("date"));
wd.setDayPictureUrl(wObj.getString("dayPictureUrl"));
wd.setNightPictureUrl(wObj.getString("nightPictureUrl"));
wd.setWeather(wObj.getString("weather"));
wd.setWind(wObj.getString("wind"));
wd.setTemperature(wObj.getString("temperature"));
weather_data.add(wd);
}
res.setWeather_data(weather_data);
res.setIndex(index);
results.add(res);
}
wea.setResults(results);
return wea;
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
// 解析xml文件
public static List<Province> getProvinces(Context context)
throws XmlPullParserException, IOException {
List<Province> provinces = null;
Province province = null;
List<City> citys = null;
City city = null;
List<District> districts = null;
District district = null;
InputStream in = context.getResources().openRawResource(
R.raw.citys_weather);
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(in, "utf-8");
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
provinces = new ArrayList<Province>();
break;
case XmlPullParser.START_TAG:
String tagName = parser.getName();
if ("p".equals(tagName)) {
province = new Province();
citys = new ArrayList<City>();
int count = parser.getAttributeCount();
for (int i = 0; i < count; i++) {
String attrName = parser.getAttributeName(i);
String attrValue = parser.getAttributeValue(i);
if ("p_id".equals(attrName))
province.setId(attrValue);
}
}
if ("pn".equals(tagName)) {
province.setName(parser.nextText());
}
if ("c".equals(tagName)) {
city = new City();
districts = new ArrayList<District>();
int count = parser.getAttributeCount();
for (int i = 0; i < count; i++) {
String attrName = parser.getAttributeName(i);
String attrValue = parser.getAttributeValue(i);
if ("c_id".equals(attrName))
city.setId(attrValue);
}
}
if ("cn".equals(tagName)) {
city.setName(parser.nextText());
}
if ("d".equals(tagName)) {
district = new District();
int count = parser.getAttributeCount();
for (int i = 0; i < count; i++) {
String attrName = parser.getAttributeName(i);
String attrValue = parser.getAttributeValue(i);
if ("d_id".equals(attrName))
district.setId(attrValue);
}
district.setName(parser.nextText());
districts.add(district);
}
break;
case XmlPullParser.END_TAG:
if ("c".equals(parser.getName())) {
city.setDisList(districts);
citys.add(city);
}
if ("p".equals(parser.getName())) {
province.setCitys(citys);
provinces.add(province);
}
break;
}
event = parser.next();
}
return provinces;
}
public static List<Map<String, Object>> toListMap(Result r) {
//从result中获取到天气信息,并将image转化为bitmap存入list
return null;
}
}
5、 交互界面显示
MainActivity.java文件实现交互功能及界面显示,代码如下:
public class MainActivity extends Activity {
private Spinner sp_province;
private Spinner sp_city;
private Spinner sp_district;
private int currentPro;
private ArrayAdapter<Province> provinceAdapter;
private ArrayAdapter<City> cityAdapter;
private ArrayAdapter<District> districtAdapter;
private List<Province> provinces;
private TextView tvCity;
private TextView tvPM25;
private TextView tvDate;
private ImageView ivpic11;
private ImageView ivpic12;
private TextView tvweek1;
private TextView tvwea1;
private TextView tvwind1;
private TextView tvtemper1;
private ImageView ivpic21;
private ImageView ivpic22;
private TextView tvweek2;
private TextView tvwea2;
private TextView tvwind2;
private TextView tvtemper2;
private ImageView ivpic31;
private ImageView ivpic32;
private TextView tvweek3;
private TextView tvwea3;
private TextView tvwind3;
private TextView tvtemper3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sp_province = (Spinner) findViewById(R.id.spinner1);
sp_city = (Spinner) findViewById(R.id.spinner2);
sp_district = (Spinner) findViewById(R.id.spinner3);
tvCity = (TextView) findViewById(R.id.tvCity);
tvPM25 = (TextView) findViewById(R.id.tvPM25);
tvDate = (TextView) findViewById(R.id.tvDate);
// 第二个城市
ivpic21 = (ImageView) findViewById(R.id.ivpic21);
ivpic22 = (ImageView) findViewById(R.id.ivpic22);
tvweek2 = (TextView) findViewById(R.id.tvweek2);
tvwea2 = (TextView) findViewById(R.id.tvwea2);
tvwind2 = (TextView) findViewById(R.id.tvwind2);
tvtemper2 = (TextView) findViewById(R.id.tvtemper2);
// 第三个城市
ivpic31 = (ImageView) findViewById(R.id.ivpic31);
ivpic32 = (ImageView) findViewById(R.id.ivpic32);
tvweek3 = (TextView) findViewById(R.id.tvweek3);
tvwea3 = (TextView) findViewById(R.id.tvwea3);
tvwind3 = (TextView) findViewById(R.id.tvwind3);
tvtemper3 = (TextView) findViewById(R.id.tvtemper3);
// 第一个城市
ivpic11 = (ImageView) findViewById(R.id.ivpic11);
ivpic12 = (ImageView) findViewById(R.id.ivpic12);
tvweek1 = (TextView) findViewById(R.id.tvweek1);
tvwea1 = (TextView) findViewById(R.id.tvwea1);
tvwind1 = (TextView) findViewById(R.id.tvwind1);
tvtemper1 = (TextView) findViewById(R.id.tvtemper1);
// 获取到地区信息
try {
provinces = HttpUtils.getProvinces(this);
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// adapter,填充信息
provinceAdapter = new ArrayAdapter<Province>(this,
android.R.layout.simple_spinner_item, android.R.id.text1,
provinces);
provinceAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_province.setAdapter(provinceAdapter);
cityAdapter = new ArrayAdapter<City>(this,
android.R.layout.simple_spinner_item, android.R.id.text1,
provinces.get(0).getCitys());
cityAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_city.setAdapter(cityAdapter);
districtAdapter = new ArrayAdapter<District>(this,
android.R.layout.simple_spinner_item, android.R.id.text1,
provinces.get(0).getCitys().get(0).getDisList());
districtAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_district.setAdapter(districtAdapter);
// 当选择省份时,城市和地方列表会变化
sp_province.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
currentPro = position;
cityAdapter = new ArrayAdapter<City>(MainActivity.this,
android.R.layout.simple_spinner_item,
android.R.id.text1, provinces.get(position).getCitys());
cityAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_city.setAdapter(cityAdapter);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// 当选择城市时,地方列表会变化
sp_city.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
districtAdapter = new ArrayAdapter<District>(MainActivity.this,
android.R.layout.simple_spinner_item,
android.R.id.text1, provinces.get(currentPro)
.getCitys().get(position).getDisList());
districtAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp_district.setAdapter(districtAdapter);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// 当选择地方时,显示具体的天气情况
sp_district.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// 选择的城市
District dis = districtAdapter.getItem(position);
// Log.i("i", dis.getName());
new WeatherAsyncTask().execute(dis.getName());
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
// 异步类,获取天气数据
class WeatherAsyncTask extends AsyncTask<String, Void, Weather> {
@Override
protected Weather doInBackground(String... params) {
String url = HttpUtils.getURl(params[0]);
String jsonStr = HttpUtils.getJsonStr(url);
Weather weather = HttpUtils.fromJson(jsonStr);
Result r = weather.getResults().get(0);
/*List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
list = HttpUtils.toListMap(r);*/
for(int i = 0;i<3;i++){
Weather_data w = r.getWeather_data().get(i);
w.setDayPicture(HttpUtils.getImage(w.getDayPictureUrl()));
w.setNightPicture(HttpUtils.getImage(w.getNightPictureUrl()));
}
return weather;
}
@Override
protected void onPostExecute(Weather result ) {
Result res = result.getResults().get(0);
Weather_data wa = res.getWeather_data().get(0);
// System.out.println(res.getWeather_data());
tvCity.setText("城市:" + res.getCurrentCity());
String pm2_5 = "".equals(res.getPm25()) ? "75" : res.getPm25();
// Log.i("i",res.getPm25()+"wwwww");
tvPM25.setText("PM2.5:" + pm2_5);
tvDate.setText("日期:" + result.getDate());
// 应该为从网络上获取到的
// ivpic11.setImageResource(R.drawable.d00);
// ivpic12.setImageResource(R.drawable.d01);
ivpic11.setImageBitmap(wa.getDayPicture());
ivpic12.setImageBitmap(wa.getNightPicture());
String str = wa.getDate();
tvweek1.setText(str.substring(0, 2));
tvwea1.setText(wa.getWeather());
tvwind1.setText(wa.getWind());
tvtemper1.setText(str.substring(14, str.length()-1));
wa = res.getWeather_data().get(1);
// System.out.println(wa2);
tvtemper2.setText(wa.getTemperature());
ivpic21.setImageBitmap(wa.getDayPicture());
ivpic22.setImageBitmap(wa.getNightPicture());
tvweek2.setText(wa.getDate());
tvwea2.setText(wa.getWeather());
tvwind2.setText(wa.getWind());
tvtemper2.setText(wa.getTemperature());
wa = res.getWeather_data().get(2);
// System.out.println(wa4);
ivpic31.setImageBitmap(wa.getDayPicture());
ivpic32.setImageBitmap(wa.getNightPicture());
tvweek3.setText(wa.getDate());
tvwea3.setText(wa.getWeather());
tvwind3.setText(wa.getWind());
tvtemper3.setText(wa.getTemperature());
}
}
}
6.citys weather.xml文件
<?xml version="1.0" encoding="utf-8"?>
<!-- START_DOCUMET:第一个节点
END_DOCUMET:尾节点
START_TAG:其他的首部的节点 p pn c cn...
END_TAG:其他的尾部的节点 </p> </c> ...
-->
<citylist>
<p p_id = "01">
<pn>北京</pn>
<c c_id="0101">
<cn>北京</cn>
<d d_id="101010101">北京</d>
<d d_id="101010200">海淀</d>
<d d_id="101010300">朝阳</d>
<d d_id="101010400">顺义</d>
<d d_id="101010500">怀柔</d>
<d d_id="101010600">通州</d>
<d d_id="101010700">昌平</d>
<d d_id="101010800">延庆</d>
<d d_id="101010900">丰台</d>
<d d_id="101011000">石景山</d>
<d d_id="101011100">大兴</d>
<d d_id="101011200">房山</d>
<d d_id="101011300">密云</d>
<d d_id="101011400">门头沟</d>
<d d_id="101011500">平谷</d>
</c>
</p>
<p p_id = "02">
<pn>上海</pn>
<c c_id="0201"><cn>上海</cn>
<d d_id="101020100">上海</d>
<d d_id="101020200">闵行</d>
<d d_id="101020300">宝山</d>
<d d_id="101020500">嘉定</d>
<d d_id="101020600">浦东南汇</d>
<d d_id="101020700">金山</d>
<d d_id="101020800">青浦</d>
<d d_id="101020900">松江</d>
<d d_id="101021000">奉贤</d>
<d d_id="101021100">崇明</d>
<d d_id="101021200">徐家汇</d>
<d d_id="101021300">浦东</d>
</c>
</p>
<p p_id = "03">
<pn>天津</pn>
<c c_id="0301"><cn>天津</cn>
<d d_id="101030100">天津</d>
<d d_id="101030200">武清</d>
<d d_id="101030300">宝坻</d>
<d d_id="101030400">东丽</d>
<d d_id="101030500">西青</d>
<d d_id="101030600">北辰</d>
<d d_id="101030700">宁河</d>
<d d_id="101030800">汉沽</d>
<d d_id="101030900">静海</d>
<d d_id="101031000">津南</d>
<d d_id="101031100">塘沽</d>
<d d_id="101031200">大港</d>
<d d_id="101031400">蓟县</d>
</c>
</p>
<p p_id = "04">
<pn>重庆</pn>
<c c_id="0401"><cn>重庆</cn>
<d d_id="101040100">重庆</d>
<d d_id="101040200">永川</d>
<d d_id="101040300">合川</d>
<d d_id="101040400">南川</d>
<d d_id="101040500">江津</d>
<d d_id="101040600">万盛</d>
<d d_id="101040700">渝北</d>
<d d_id="101040800">北碚</d>
<d d_id="101040900">巴南</d>
<d d_id="101041000">长寿</d>
<d d_id="101041100">黔江</d>
<d d_id="101041300">万州</d>
<d d_id="101041400">涪陵</d>
<d d_id="101041500">开县</d>
<d d_id="101041600">城口</d>
<d d_id="101041700">云阳</d>
<d d_id="101041800">巫溪</d>
<d d_id="101041900">奉节</d>
<d d_id="101042000">巫山</d>
<d d_id="101042100">潼南</d>
<d d_id="101042200">垫江</d>
<d d_id="101042300">梁平</d>
<d d_id="101042400">忠县</d>
<d d_id="101042500">石柱</d>
<d d_id="101042600">大足</d>
<d d_id="101042700">荣昌</d>
<d d_id="101042800">铜梁</d>
<d d_id="101042900">璧山</d>
<d d_id="101043000">丰都</d>
<d d_id="101043100">武隆</d>
<d d_id="101043200">彭水</d>
<d d_id="101043300">綦江</d>
<d d_id="101043400">酉阳</d>
<d d_id="101043600">秀山</d>
</c>
</p>
<p p_id = "05">
<pn>黑龙江</pn>
<c c_id="0501"><cn>哈尔滨</cn>
<d d_id="101050101">哈尔滨</d>
<d d_id="101050102">双城</d>
<d d_id="101050103">呼兰</d>
<d d_id="101050104">阿城</d>
<d d_id="101050105">宾县</d>
<d d_id="101050106">依兰</d>
<d d_id="101050107">巴彦</d>
<d d_id="101050108">通河</d>
<d d_id="101050109">方正</d>
<d d_id="101050110">延寿</d>
<d d_id="101050111">尚志</d>
<d d_id="101050112">五常</d>
<d d_id="101050113">木兰</d>
</c>
<c c_id="0502"><cn>齐齐哈尔</cn>
<d d_id="101050201">齐齐哈尔</d>
<d d_id="101050202">讷河</d>
<d d_id="101050203">龙江</d>
<d d_id="101050204">甘南</d>
<d d_id="101050205">富裕</d>
<d d_id="101050206">依安</d>
<d d_id="101050207">拜泉</d>
<d d_id="101050208">克山</d>
<d d_id="101050209">克东</d>
<d d_id="101050210">泰来</d>
</c>
<c c_id="0503"><cn>牡丹江</cn>
<d d_id="101050301">牡丹江</d>
<d d_id="101050302">海林</d>
<d d_id="101050303">穆棱</d>
<d d_id="101050304">林口</d>
<d d_id="101050305">绥芬河</d>
<d d_id="101050306">宁安</d>
<d d_id="101050307">东宁</d>
</c>
<c c_id="0504"><cn>佳木斯</cn>
<d d_id="101050401">佳木斯</d>
<d d_id="101050402">汤原</d>
<d d_id="101050403">抚远</d>
<d d_id="101050404">桦川</d>
<d d_id="101050405">桦南</d>
<d d_id="101050406">同江</d>
<d d_id="101050407">富锦</d>
</c>
<c c_id="0505"><cn>绥化</cn>
<d d_id="101050501">绥化</d>
<d d_id="101050502">肇东</d>
<d d_id="101050503">安达</d>
<d d_id="101050504">海伦</d>
<d d_id="101050505">明水</d>
<d d_id="101050506">望奎</d>
<d d_id="101050507">兰西</d>
<d d_id="101050508">青冈</d>
<d d_id="101050509">庆安</d>
<d d_id="101050510">绥棱</d>
</c>
<c c_id="0506"><cn>黑河</cn>
<d d_id="101050601">黑河</d>
<d d_id="101050602">嫩江</d>
<d d_id="101050603">孙吴</d>
<d d_id="101050604">逊克</d>
<d d_id="101050605">五大连池</d>
<d d_id="101050606">北安</d>
</c>
<c c_id="0507"><cn>大兴安岭</cn>
<d d_id="101050701">大兴安岭</d>
<d d_id="101050702">塔河</d>
<d d_id="101050703">漠河</d>
<d d_id="101050704">呼玛</d>
<d d_id="101050705">呼中</d>
<d d_id="101050706">新林</d>
<d d_id="101050708">加格达奇</d>
</c>
<c c_id="0508"><cn>伊春</cn>
<d d_id="101050801">伊春</d>
<d d_id="101050802">乌伊岭</d>
<d d_id="101050803">五营</d>
<d d_id="101050804">铁力</d>
<d d_id="101050805">嘉荫</d>
</c>
<c c_id="0509"><cn>大庆</cn>
<d d_id="101050901">大庆</d>
<d d_id="101050902">林甸</d>
<d d_id="101050903">肇州</d>
<d d_id="101050904">肇源</d>
<d d_id="101050905">杜尔伯特</d>
</c>
<c c_id="0510"><cn>七台河</cn>
<d d_id="101051002">七台河</d>
<d d_id="101051003">勃利</d>
</c>
<c c_id="0511"><cn>鸡西</cn>
<d d_id="101051101">鸡西</d>
<d d_id="101051102">虎林</d>
<d d_id="101051103">密山</d>
<d d_id="101051104">鸡东</d>