您的位置:首页 > 移动开发 > Android开发

Android spinner三级连动菜单实现核心代码

2016-03-05 21:35 387 查看
“`

package com.l000phone.day05_spinnerexercise3;

import java.util.LinkedHashSet;

import java.util.List;

import java.util.Set;

import org.xmlpull.v1.XmlPullParser;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemSelectedListener;

import android.widget.ArrayAdapter;

import android.widget.Spinner;

import android.widget.TextView;

import com.l000phone.entity.Province;

import com.l000phone.util.CityWeatherParse;

public class MainActivity extends Activity {

private Spinner sp_province_id;// 省份信息显示下拉列表框控件

private Spinner sp_city_id;// 市级信息显示下拉列表框控件

private Spinner sp_county_id;// 县级信息显示下拉列表框控件

private ArrayAdapter<String> provinceAdapter;
private ArrayAdapter<String> cityAdapter;
private ArrayAdapter<String> countyAdapter;

private String provinceName;// 选中的省份名
private Set<String> address;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 思路:
// ①界面控件对象的获取
sp_province_id = (Spinner) findViewById(R.id.sp_province_id);
sp_city_id = (Spinner) findViewById(R.id.sp_city_id);
sp_county_id = (Spinner) findViewById(R.id.sp_county_id);

// ②准备数据源
XmlPullParser parser = getResources().getXml(R.xml.citys_weather);
List<Province> provinces = CityWeatherParse.getProvincesInfo(parser);
address = new LinkedHashSet<>();

// ③获得适配器对象
provinceAdapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_dropdown_item,
CityWeatherParse.getAllProvinceNames(provinces));

cityAdapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_dropdown_item);

countyAdapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_dropdown_item);

// ④将适配器与Spinner控件进行绑定
sp_province_id.setAdapter(provinceAdapter);
sp_city_id.setAdapter(cityAdapter);
sp_county_id.setAdapter(countyAdapter);

// ⑤给Spinner下拉列表控件添加监听器(只需要给省份信息显示下拉列表框添加监听器即可)
OnItemSelectedListener listener = new MyOnItemSelectedListener(
provinces);
sp_province_id.setOnItemSelectedListener(listener);
sp_city_id.setOnItemSelectedListener(listener);
sp_county_id.setOnItemSelectedListener(listener);
sp_city_id.setSelection(0);

}

// 监听器OnItemSelectedListener实现类
private final class MyOnItemSelectedListener implements
OnItemSelectedListener {
private List<Province> provinces;

public MyOnItemSelectedListener(List<Province> provinces) {
super();
this.provinces = provinces;
}

/*
* (non-Javadoc)
*
* @see
* android.widget.AdapterView.OnItemSelectedListener#onItemSelected(
* android.widget.AdapterView, android.view.View, int, long)
*/
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
address.add(((TextView)view).getText().toString());

// 思路:
// ①根据选中的省份信息,将该省份对应的所有市级信息读取出来,设置到cityAdapter中
// ②根据选中的市级信息,将该市对应的所有县级信息读取出来,设置到countyAdapter中
String cityName;

switch (parent.getId()) {
case R.id.sp_province_id:
// -->修改市级适配器
// a)获取省份的名字
provinceName = ((TextView) view).getText().toString();

// b)将省份对应的所有市读取取出来
List<String> allCities = CityWeatherParse.getAllCityNames(// 在这儿用 就相当于 是 局部变量喽
provinceName, provinces);

// c)修改适配器,并通知控件刷新
cityAdapter.clear();
cityAdapter.addAll(allCities);
cityAdapter.notifyDataSetChanged();

// 更新县级适配器操作
cityName = allCities.get(0);
modifyCountyAdapter(cityName);
MainActivity.this.setTitle("您的籍贯是:"+address.toString());
break;
case R.id.sp_city_id:
// 获取市的名字
cityName = ((TextView) view).getText().toString();
Log.i("PROVINCE_NAME", provinceName);
// 更新县级适配器操作
modifyCountyAdapter(cityName);
MainActivity.this.setTitle("您的籍贯是:"+address.toString());
break;
case R.id.sp_county_id:
MainActivity.this.setTitle("您的籍贯是:"+address.toString());
address.clear();
break;

default:
break;
}

}

/**
* @param view
*/
private void modifyCountyAdapter(String cityName) {

// b)将市对应的所有县读取取出来
List<String> allCounties = CityWeatherParse.getAllCountyames(
cityName, provinceName, provinces);

// c)修改适配器,并通知控件刷新
countyAdapter.clear();
countyAdapter.addAll(allCounties);
countyAdapter.notifyDataSetChanged();
sp_county_id.setSelection(0);
}

/*
* (non-Javadoc)
*
* @see
* android.widget.AdapterView.OnItemSelectedListener#onNothingSelected
* (android.widget.AdapterView)
*/
@Override
public void onNothingSelected(AdapterView<?> parent) {

}

}


}

“`util

/**
*
*/
package com.l000phone.util;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;

import com.l000phone.entity.City;
import com.l000phone.entity.County;
import com.l000phone.entity.Province;

/**
* Description: 城市天气情况解析<br/>
* Copyright (c) , 2016, Jansonxu <br/>
* This program is protected by copyright laws. <br/>
* Program Name:CityWeatherParse.java <br/>
* Date: 2016-2-17
*
* @author ly
* @version : 1.0
*/
public class CityWeatherParse {

/**
* 获取所有省份的名字
*
* @param provinces
* @return
*/
public static List<String> getAllProvinceNames(List<Province> provinces) {
List<String> allNames = new LinkedList<>();
for (Province Provice : provinces) {
allNames.add(Provice.getPn());
}

return allNames;
}

/**
*
* @param parser
* @return
*/
public static List<Province> getProvincesInfo(XmlPullParser parser) {
// 思路
@SuppressWarnings("unused")
InputStream is = null;
List<Province> provinces = null;// 存放所有的省份信息
try {

// 解析
int eventType = parser.getEventType();
Province province = null;// 省份实例声明
City city = null;// 城市实例的声明
County county = null;// 县实例的声明

while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = parser.getName();

switch (eventType) {
case XmlPullParser.START_DOCUMENT:
System.out.println("xml解析开始...");
provinces = new LinkedList<>();
break;
case XmlPullParser.START_TAG:
if ("p".equals(nodeName)) {
province = new Province();// 省份实例的构建
// 将p节点的属性设置到Province实例中
setInstanceAttrValue(parser, province);
} else if ("pn".equals(nodeName)) {
province.setPn(parser.nextText());
} else if ("c".equals(nodeName)) {
city = new City();// 城市实例的构建
// 将c节点的属性设置到City实例中
setInstanceAttrValue(parser, city);
} else if ("cn".equals(nodeName)) {
city.setCn(parser.nextText());
} else if ("d".equals(nodeName)) {
county = new County();
setInstanceAttrValue(parser, county);
county.setDn(parser.nextText());

// 应该将其添加到City中
city.getCounties().add(county);
}

break;
case XmlPullParser.END_TAG:
if ("c".equals(nodeName)) {
province.getCities().add(city);
} else if ("p".equals(nodeName)) {
provinces.add(province);
}

break;
}
eventType = parser.next();

}

System.out.println("xml解析结束...");
// ④分析解析后的结果
System.out.println("xml文件解析的结果是:");
for (Province p : provinces) {
System.out.println(p);
}

} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// ⑤释放资源
return provinces;
}

}

/**
* 设置实例的属性值
*
* @param parser
* @param obj
*/
private static void setInstanceAttrValue(XmlPullParser parser, Object obj) {
for (int index = 0; index < parser.getAttributeCount(); index++) {
String attrName = parser.getAttributeName(index);
String attrValue = parser.getAttributeValue(index);
if ("p_id".equals(attrName)) {
((Province) obj).setP_id(attrValue);
} else if ("c_id".equals(attrName)) {
((City) obj).setC_id(attrValue);
} else if ("d_id".equals(attrName)) {
((County) obj).setD_id(attrValue);
}
}
}

/**
* 根据传入的省份名,获取该省份下所有的市名
*
* @param provinceName
* @param provinces
* @return
*/
public static List<String> getAllCityNames(String provinceName,
List<Province> provinces) {
List<String> cityNames = new LinkedList<>();

for (Province province : provinces) {
if (provinceName != null && provinceName.equals(province.getPn())) {
for (City city : province.getCities()) {
cityNames.add(city.getCn());
}
break;
}
}

return cityNames;
}

/**
* 根据传入的省份名、城市名,获得该城市下所有的县名
*
* @param cityName
* @param provinceName
* @param provinces
* @return
*/
public static List<String> getAllCountyames(String cityName,
String provinceName, List<Province> provinces) {
List<String> countyNames = new LinkedList<>();

EXIT_FLG: for (Province provice : provinces) {
if (provinceName != null && provinceName.equals(provice.getPn())) {
for (City city : provice.getCities()) {
if (cityName != null && cityName.equals(city.getCn())) {
for (County county : city.getCounties()) {
countyNames.add(county.getDn());
}
break EXIT_FLG;
}

}
}
}

Log.i("PROVINCE_NAME", "countyNames = " + countyNames + ",cityName = "
+ cityName + ",provinces=" + provinces);
return countyNames;
}

}


entity

/**
*
*/
package com.l000phone.entity;

import java.util.LinkedList;
import java.util.List;

/**
* Description: 地级市实体类<br/>
* Copyright (c) , 2016, Jansonxu <br/>
* This program is protected by copyright laws. <br/>
* Program Name:City.java <br/>
* Date: 2016-2-17
*
* @authorly
* @version : 1.0
*/
public class City {
private String c_id;// 城市的id
private String cn;// 城市名字
private List<County> counties = new LinkedList<>();// 多个县,县级市

public City() {
super();
}

public City(String c_id, String cn, List<County> counties) {
super();
this.c_id = c_id;
this.cn = cn;
this.counties = counties;
}

public String getC_id() {
return c_id;
}

public void setC_id(String c_id) {
this.c_id = c_id;
}

public String getCn() {
return cn;
}

public void setCn(String cn) {
this.cn = cn;
}

public List<County> getCounties() {
return counties;
}

public void setCounties(List<County> counties) {
this.counties = counties;
}

@Override
public String toString() {
return "City [c_id=" + c_id + ", cn=" + cn + ", counties=" + counties
+ "]";
}

}


/**

*

*/

package com.l000phone.entity;

/**

* Description: 县(县级市)实体类

* Copyright (c) , 2016, Jansonxu

* This program is protected by copyright laws.

* Program Name:County.java

* Date: 2016-2-17

*

* @author ly

* @version : 1.0

*/

public class County {

private String d_id;// 县的id

private String dn;// 县名

public County() {
super();
}

public County(String d_id, String dn) {
super();
this.d_id = d_id;
this.dn = dn;
}

public String getD_id() {
return d_id;
}

public void setD_id(String d_id) {
this.d_id = d_id;
}

public String getDn() {
return dn;
}

public void setDn(String dn) {
this.dn = dn;
}

@Override
public String toString() {
return "County [d_id=" + d_id + ", dn=" + dn + "]";
}


}



/**

*

*/

package com.l000phone.entity;

import java.util.LinkedList;

import java.util.List;

/**

* Description: 省份实体类

* Copyright (c) , 2016, Jansonxu

* This program is protected by copyright laws.

* Program Name:Province.java

* Date: 2016-2-17

*

* @author ly

* @version : 1.0

*/

public class Province {

private String p_id;// 省份id

private String pn;// 省份名字

private List cities = new LinkedList<>();// 多个地级市

public Province() {
super();
}

public Province(String p_id, String pn, List<City> cities) {
super();
this.p_id = p_id;
this.pn = pn;
this.cities = cities;
}

public String getP_id() {
return p_id;
}

public void setP_id(String p_id) {
this.p_id = p_id;
}

public String getPn() {
return pn;
}

public void setPn(String pn) {
this.pn = pn;
}

public List<City> getCities() {
return cities;
}

public void setCities(List<City> cities) {
this.cities = cities;
}

@Override
public String toString() {
return "Province [p_id=" + p_id + ", pn=" + pn + ", cities=" + cities
+ "]";
}


}

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