本篇文章主要内容为:运用Volley框架进行网络请求,调用百度天气API并对得到的json数据解析。
天气接口为百度API的,地址:http://apistore.baidu.com/apiworks/servicedetail/478.html。
首先选择要查询天气的城市,然后根据城市名,得到该城市七日天气数据。其中用的城市列表是参考网上的,
原地址:http://www.okbase.net/file/item/33385。
主页面上有一个按钮,点击后进入城市列表选择城市,一个TextView显示标题,一个ListView显示城市七日天气数据。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#F0F0F0"
android:orientation="vertical" >
<Button
android:id="@+id/selectBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="选择城市" />
<TextView
android:id="@+id/tv_city"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="48dp"
android:textSize="18sp"
android:textColor="#000"
/>
<ListView
android:id="@+id/list_weather"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:dividerHeight="1dp"
android:divider="#E0E0E0"
/>
LinearLayout>
将解析到的数据格式化显示。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dp"
android:padding="10dp">
<TextView
style="@style/txtStyle"
android:id="@+id/tv_date"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="2016-3-16"
/>
<TextView
style="@style/txtStyle"
android:id="@+id/tv_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/tv_date"
android:layout_marginLeft="100dp"
android:gravity="center_horizontal"
android:text="多云"
/>
<TextView
style="@style/txtStyle"
android:id="@+id/tv_max"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toRightOf="@id/tv_date"
android:layout_below="@id/tv_status"
android:layout_marginLeft="20dp"
android:gravity="center_vertical"
android:text="15"
/>
<TextView
style="@style/txtStyle"
android:id="@+id/tv_min"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toRightOf="@id/tv_max"
android:layout_below="@id/tv_status"
android:layout_marginLeft="60dp"
android:gravity="center_vertical"
android:text="6"
/>
RelativeLayout>
主要业务是选择城市,通过Volley向天气接口发出请求,解析返回的json数据。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import com.android.volley.AuthFailureError;
import com.android.volley.Request.Method;
import com.android.volley.RequestQueue;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.dialog.CustomProgressDialog;
public class MainActivity extends Activity {
private Button btn;
private TextView tv_city;
private ListView list_weather;
private WeatherAdapter mAdapter;
private static final int REQUEST_CITY = 0;
private RequestQueue mQueue; // volley的请求队列
private static final String apikey = "1a03add595481b304fdef3660c02d97d"; //此处为你申请的apikey
private List
public class WeatherAdapter extends BaseAdapter {
private Context mContext;
private List>datas;
private LayoutInflater inflater;
public WeatherAdapter(Context mContext, List> datas) {
this.mContext = mContext;
this.datas = datas;
inflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int arg0) {
return datas.get(arg0);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
convertView = inflater.inflate(R.layout.weather_item, null);
holder = new ViewHolder();
holder.tv_date = (TextView) convertView.findViewById(R.id.tv_date);
holder.tv_status = (TextView) convertView.findViewById(R.id.tv_status);
holder.tv_max = (TextView) convertView.findViewById(R.id.tv_max);
holder.tv_min = (TextView) convertView.findViewById(R.id.tv_min);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.tv_date.setText(datas.get(position).get("tv_date"));
holder.tv_status.setText(datas.get(position).get("tv_status"));
holder.tv_max.setText("最高温:" + datas.get(position).get("tv_max"));
holder.tv_min.setText("最低温:" + datas.get(position).get("tv_min"));
return convertView;
}
static class ViewHolder{
private TextView tv_date;
private TextView tv_status;
private TextView tv_max;
private TextView tv_min;
}
}
城市列表部分的代码请见源码