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

来源:互联网 发布:ubuntu systemd 安装 编辑:程序博客网 时间:2024/06/01 23:05

依照此方式 可以实现任何的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();
 }
}

运行结果如图:



原创粉丝点击