您的位置:首页 > 移动开发 > Objective-C

android 解析webservice List<Object> 填充下拉列表

2011-11-29 10:44 585 查看
依照此方式 可以实现任何的Object填充Spinner 以及调用任何免费webservice。

资源文件如下:

<?xml version="1.0" encoding="utf-8"?>

<resources>

<color name="black">#000000</color>

<color name="write">#00FFFFFF</color>

</resources>

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="app_name">WeatherApp</string>

<string name="province_list_title">请选择省份</string>

<string name="city_list_title">请选择城市</string>

<string name="finding">搜索中</string>

<string name="finding_province">正在搜索地区...</string>

<string name="finding_city">正在搜索城市...</string>

</resources>

<?xml version="1.0" encoding="UTF-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/text1"

android:paddingTop="2.0dip"

android:paddingBottom="3.0dip"

android:layout_width="fill_parent"

android:layout_height="53px"

android:textSize="24px"

android:paddingLeft="25px"

android:paddingRight="50px"

android:singleLine="true"

android:gravity="center_vertical"

android:ellipsize="marquee"

android:textColor="@color/black"

android:background="@color/write" />

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@drawable/splash_bg">

<Spinner android:id="@+id/province_list"

android:layout_width="215px"

android:layout_height="53px"

android:prompt="@string/province_list_title"

android:background="@drawable/add_province_name"/>

<Spinner android:id="@+id/city_list"

android:layout_width="215px"

android:layout_height="53px"

android:prompt="@string/city_list_title"

android:background="@drawable/add_province_name"/>

</LinearLayout>

ok了 资源文件结束 不解释! 资源中用到的图片 是一个美丽的下拉框 和一个宇宙的背景图

介绍一下实体类吧

package com.fw.entity.weather;

import java.io.Serializable;

import android.os.Parcel;

import android.os.Parcelable;

public class City implements Serializable ,Parcelable {

public City(){}

public City(String cityID , String cityName){

this.cityID = cityID;

this.cityName = cityName;

}

public String getCityID() {

return cityID;

}

public void setCityID(String cityID) {

this.cityID = cityID;

}

public String getCityName() {

return cityName;

}

public void setCityName(String cityName) {

this.cityName = cityName;

}

private String cityID;

private String cityName;

@Override

public int describeContents() {

// TODO Auto-generated method stub

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

// TODO Auto-generated method stub

}

@Override

public String toString() {

// TODO Auto-generated method stub

return cityName;

}

}

package com.fw.entity.weather;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.List;

import android.os.Parcel;

import android.os.Parcelable;

public class Province implements Serializable ,Parcelable {

public Province(){}

public Province(String regionID , String regionName){

this.regionID = regionID;

this.regionName = regionName;

}

public String getRegionID() {

return regionID;

}

public void setRegionID(String regionID) {

this.regionID = regionID;

}

public String getRegionName() {

return regionName;

}

public void setRegionName(String regionName) {

this.regionName = regionName;

}

public ArrayList<City> getCitys() {

if(this.citys == null){

citys = new ArrayList<City>();

}

return citys;

}

public void setCitys(ArrayList<City> citys) {

this.citys = citys;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return regionName;

}

private String regionID;

private String regionName;

private ArrayList<City> citys;

@Override

public int describeContents() {

// TODO Auto-generated method stub

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

// TODO Auto-generated method stub

}

}

package com.fw.action.weather;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import org.ksoap2.SoapEnvelope;

import org.ksoap2.serialization.AttributeInfo;

import org.ksoap2.serialization.SoapObject;

import org.ksoap2.serialization.SoapSerializationEnvelope;

import org.ksoap2.transport.HttpTransportSE;

import android.util.Log;

import com.fw.entity.weather.City;

import com.fw.entity.weather.Province;

public class WeatherService {

private SoapObject sopObject ;

// 命名空间

private static final String NAMESPACE = "http://WebXml.com.cn/";

//天气预报endPoint

private static final String WEATHERENDPOINT = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";

//天气预报soapAction

private static final String WEATHERREGIONACTIVITY = "http://WebXml.com.cn/getRegionDataset";

private static final String WEATHERCITYACTIVITY = "http://WebXml.com.cn/getSupportCityDataset";

// 调用的方法名称

private static final String GETSUPPORTDATA = "getRegionDataset"; //省份 (国家)

private static final String GETSUPPORTCITYDATASET = "getSupportCityDataset"; //省份对应下的城市

private static String GETWEATHER = "getWeather";

public WeatherService(){

//实例化 处理

}

public ArrayList<Province> getProvinceList() {

ArrayList<Province> list = new ArrayList<Province>();

SoapObject rpc = new SoapObject(NAMESPACE, GETSUPPORTDATA);

// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.bodyOut = rpc;

// 设置是否调用的是dotNet开发的WebService

envelope.dotNet = true;

envelope.setOutputSoapObject(rpc);

HttpTransportSE transport = new HttpTransportSE(WEATHERENDPOINT);

try {

// 调用WebService

transport.call(WEATHERREGIONACTIVITY, envelope);

} catch (Exception e) {

e.printStackTrace();

}

SoapObject soapObject = (SoapObject) envelope.bodyIn;

soapObject = (SoapObject)soapObject.getProperty(0);

soapObject = (SoapObject)soapObject.getProperty(1);

soapObject = (SoapObject)soapObject.getProperty(0);

int count = soapObject.getPropertyCount();

Province province = null;

for(int i = 0 ; i < count ; i ++ ){

SoapObject soapProvince = (SoapObject)soapObject.getProperty(i);

province = new Province(soapProvince.getProperty("RegionID").toString(),soapProvince.getProperty("RegionName").toString());

list.add(province);

}

return list;

}

public boolean getProvinceCitys(Province province){

SoapObject rpc = new SoapObject(NAMESPACE, GETSUPPORTCITYDATASET);

// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本

rpc.addProperty("theRegionCode", province.getRegionID());

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.bodyOut = rpc;

// 设置是否调用的是dotNet开发的WebService

envelope.dotNet = true;

envelope.setOutputSoapObject(rpc);

HttpTransportSE transport = new HttpTransportSE(WEATHERENDPOINT);

try {

// 调用WebService

transport.call(WEATHERCITYACTIVITY, envelope);

} catch (Exception e) {

e.printStackTrace();

}

SoapObject soapObject = (SoapObject) envelope.bodyIn;

soapObject = (SoapObject)soapObject.getProperty(0);

soapObject = (SoapObject)soapObject.getProperty(1);

soapObject = (SoapObject)soapObject.getProperty(0);

int count = soapObject.getPropertyCount();

City city = null;

for(int i = 0 ; i < count ; i ++ ){

SoapObject soapProvince = (SoapObject)soapObject.getProperty(i);

city = new City(soapProvince.getProperty("CityID").toString(),soapProvince.getProperty("CityName").toString());

province.getCitys().add(city);

}

return false;

}

}

package com.fw.activiy.weather;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.StreamCorruptedException;

import java.util.ArrayList;

import android.app.Activity;

import android.app.Dialog;

import android.app.ProgressDialog;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ArrayAdapter;

import android.widget.Spinner;

import android.widget.AdapterView.OnItemSelectedListener;

import com.fw.action.weather.WeatherService;

import com.fw.entity.weather.City;

import com.fw.entity.weather.Province;

public class WeatherView extends Activity implements Runnable {

public static final int GET_SUPPORT_DATA_TYPE = 0x01;

public static final int GET_CITY_DATA_TYPE = 0x02;

public static final int OPEN_FIND_CITY_DIALOG = 0x03;

public ArrayList<Province> provinces;

public Province curProvince;

public Handler weatherHandler = null;

private Spinner provinceSpinner = null;

private Spinner citySpinner = null;

private ArrayAdapter arrayAdapter ;

private Dialog progressDialog;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

provinceSpinner = (Spinner) findViewById(R.id.province_list);

citySpinner = (Spinner) findViewById(R.id.city_list);

setHandlerMessage();

boolean findProvince = false;

try {

FileInputStream inStream = this.openFileInput("provinces.bin");

ObjectInputStream objectInputStream = new ObjectInputStream(inStream);

provinces = (ArrayList<Province>) objectInputStream.readObject();

arrayAdapter = new ArrayAdapter(this,R.layout.text_spinner_item, provinces);

provinceSpinner.setAdapter(arrayAdapter);

Log.e("provinceSpinner", "Adapter OK");

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

findProvince = true;

Log.e("FileNotFoundException", "provinces not found");

} catch (StreamCorruptedException e) {

// TODO Auto-generated catch block

findProvince = true;

Log.e("StreamCorruptedException", e.toString(), e);

} catch (IOException e) {

// TODO Auto-generated catch block

findProvince = true;

Log.e("IOException", e.toString(), e);

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

findProvince = true;

Log.e("ClassNotFoundException", e.toString(), e);

}

if(findProvince){

progressDialog = new ProgressDialog.Builder(this).

setTitle(R.string.finding).

setMessage(R.string.finding_province).

create();

progressDialog.show();

new Thread(this).start();

}

provinceSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override

public void onItemSelected(final AdapterView<?> parent, View view,

final int position, long id) {

// TODO Auto-generated method stub

curProvince = (Province) parent.getItemAtPosition(position);

if (curProvince.getCitys().size() < 1){

Message mes = weatherHandler.obtainMessage();

mes.getData().putInt("type", OPEN_FIND_CITY_DIALOG);

weatherHandler.sendMessage(mes);

new Thread(new Runnable() {

@Override

public void run() {

WeatherService weatherService = new WeatherService();

weatherService.getProvinceCitys(curProvince);

Message mes = weatherHandler.obtainMessage();

mes.getData().putInt("type", GET_CITY_DATA_TYPE);

mes.getData().putParcelableArrayList("value",curProvince.getCitys());

weatherHandler.sendMessage(mes);

}

}).start();

}else{

arrayAdapter = new ArrayAdapter(WeatherView.this,R.layout.text_spinner_item, curProvince.getCitys());

citySpinner.setAdapter(arrayAdapter);

}

}

@Override

public void onNothingSelected(AdapterView<?> parent) {

// TODO Auto-generated method stub

}

});

}

private void setHandlerMessage() {

weatherHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

int type = msg.getData().getInt("type");

switch (type) {

case GET_SUPPORT_DATA_TYPE:

provinces = msg.getData().getParcelableArrayList("value");

arrayAdapter = new ArrayAdapter(WeatherView.this, R.layout.text_spinner_item,provinces);

provinceSpinner.setAdapter(arrayAdapter);

progressDialog.dismiss();

break;

case GET_CITY_DATA_TYPE:

ArrayList<City> cityList = msg.getData().getParcelableArrayList("value");

arrayAdapter = new ArrayAdapter(WeatherView.this,R.layout.text_spinner_item, cityList);

curProvince.setCitys(cityList);

citySpinner.setAdapter(arrayAdapter);

progressDialog.dismiss();

break;

case OPEN_FIND_CITY_DIALOG:

progressDialog = new ProgressDialog.Builder(WeatherView.this).

setTitle(R.string.finding).

setMessage(R.string.finding_city).

create();

progressDialog.show();

}

}

};

}

@Override

public void run() {

// TODO Auto-generated method stub

WeatherService weatherService = new WeatherService();

ArrayList<Province> provinceList = weatherService.getProvinceList();

try {

FileOutputStream outStream = this.openFileOutput("provinces.bin",MODE_PRIVATE);

ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);

objectOutputStream.writeObject(provinceList);

objectOutputStream.flush();

objectOutputStream.close();

outStream.close();

Log.e("FileOutputStream", "Over");

} catch (Exception e) {

// TODO Auto-generated catch block

Log.e("FileOutputStream Exception", e.toString(), e);

}

Message mes = weatherHandler.obtainMessage();

mes.getData().putInt("type", GET_SUPPORT_DATA_TYPE);

mes.getData().putParcelableArrayList("value", provinceList);

weatherHandler.sendMessage(mes);

}

@Override

public void onBackPressed() {

// TODO Auto-generated method stub

// 退出程序的时候把province信息存储在二进制文件中

try {

FileOutputStream outStream = this.openFileOutput("provinces.bin",MODE_PRIVATE);

ObjectOutputStream objectOutputStream = new ObjectOutputStream(outStream);

objectOutputStream.writeObject(provinces);

objectOutputStream.flush();

objectOutputStream.close();

outStream.close();

Log.e("FileOutputStream", "Over");

} catch (Exception e) {

// TODO Auto-generated catch block

Log.e("FileOutputStream Exception", e.toString(), e);

}

super.onBackPressed();

}

}

运行结果如图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐