安卓Json解析
天气预报
该应用程序所用到的知识:
1、 开源框架AsyncHttp,fastjson,
2、 WebServer天气预报数据
1、根据网络返回的json数据创建对应的类。
遇到[ ]为arrylist集合,
效果
二、布局
1、mainLayout
<LinearLayoutxmlns: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:orientation="vertical"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="@+id/et_city"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="请输入你要查询的城市"
android:text=""/>
<Button
android:id="@+id/btn_query"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="5dp"
android:text="查询" />
</LinearLayout>
<ListView
android:id="@+id/lv_forecast"
android:layout_width="match_parent"
android:layout_height="wrap_content"
></ListView>
</LinearLayout>
2、
<?xml version="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="24日,星期一" />
<TextView
android:id="@+id/tv_weather"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="多云" />
</LinearLayout>
<!-- <TextView
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EDEDED"
/> -->
</LinearLayout>
三、代码
1、网络请求权限
<uses-permissionandroid:name="android.permission.INTERNET" />
2、
public class MainActivity extends Activity{
//查询url的地址
publicstatic final StringrootURL="http://wthrcdn.etouch.cn/weather_mini?city=";
privateButton btnQuery;
privateEditText etCity;
privateListView lv;
privateArrayList<Day> forecast;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();//初始化视图
initData();//初始化数据
}
privatevoid initView() {
//找到需要的控件
etCity= (EditText) findViewById(R.id.et_city);
btnQuery= (Button) findViewById(R.id.btn_query);
lv= (ListView) findViewById(R.id.lv_forecast);
}
privatevoid initData() {
//设置查询按钮监听事件
btnQuery.setOnClickListener(newOnClickListener() {
publicvoid onClick(View v) {
//得到要查询的城市名
String name =etCity.getText().toString().trim();
if(TextUtils.isEmpty(name)) {
Toast.makeText(getApplicationContext(),"输入的城市名为空", 0).show();
}else{
String url=rootURL+name;
AsyncHttpClient c = new AsyncHttpClient();
c.get(url, new TextHttpResponseHandler() {
@Override
publicvoid onSuccess(int statusCode, Header[] headers,
StringresponseString) {
//当网络请求成功时拿到需要的字符串进行json解析
StringcityJson = responseString;
String s=cityJson;
Json object = JSON.parseObject(s, Json.class);
String cityName = object.getData().getCity();
//得到想要的数据
forecast = object.getData().getForecast();
//设置适配器
lv.setAdapter(myAdapter);
}
@Override
publicvoid onFailure(int statusCode, Header[] headers,
StringresponseString, Throwable throwable) {
Toast.makeText(getApplicationContext(),"查询不到该城市", 0).show();
}
});
}
}
});
}
privateBaseAdapter myAdapter=new BaseAdapter() {
@Override
publicView getView(int position, View convertView, ViewGroup parent) {
//用打气筒将自定义的布局填充成listView的条目
Viewview = View.inflate(getApplicationContext(), R.layout.item, null);
TextViewdate=(TextView) view.findViewById(R.id.tv_date);
TextViewweather=(TextView)view.findViewById(R.id.tv_weather);
date.setText(forecast.get(position).getDate());
weather.setText(forecast.get(position).getType());
returnview;
}
@Override
publiclong getItemId(int position) {
return0;
}
@Override
publicObject getItem(int arg0) {
returnnull;
}
@Override
publicint getCount() {
returnforecast.size();
}
};
}