本文主要是介绍基于Spinner的省市县三级联动选择显示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
通过xml解析获得数据源,通过Spinner进行三级的联动显示,以下为源代码
Mainactivity代码
public class MainActivity extends Activity {Spinner spinner1, spinner2, spinner3;Province province = null;City city = null;List<Province> list = new ArrayList<Province>();List<String> list1 = new ArrayList<String>();// 省的名字列表List<String> list2 = new ArrayList<String>();// 城市名字列表List<String> list3 = new ArrayList<String>();// 地区名字列表int index1;// 选取的省int index2;// 选取的市ArrayAdapter<String> arrayAdapter1;ArrayAdapter<String> arrayAdapter2;ArrayAdapter<String> arrayAdapter3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化spinnerspinner2 = (Spinner) findViewById(R.id.s2);spinner1 = (Spinner) findViewById(R.id.s1);spinner3 = (Spinner) findViewById(R.id.s3);parser1();// 通过parse1函数,赋值listfinal int layOutId = android.R.layout.simple_list_item_1;// 获得省会的listfor (Province tp : list) {list1.add(tp.getName());}arrayAdapter1 = new ArrayAdapter<String>(this,layOutId, list1);// 初始化list2,用于初始化城市适配器for (City tc : list.get(0).getCitys()) {list2.add(tc.getName());}arrayAdapter2 = new ArrayAdapter<String>(this,layOutId, list2);// 初始化list3,用于初始化地区适配器for (String ts : list.get(0).getCitys().get(0).getDistricts()) {list3.add(ts);}arrayAdapter3 = new ArrayAdapter<String>(this,layOutId, list3);spinner1.setAdapter(arrayAdapter1);spinner1.setSelection(0, true);spinner2.setAdapter(arrayAdapter2);spinner2.setSelection(0, true);spinner3.setAdapter(arrayAdapter3);spinner3.setSelection(0, true);spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {index1 = position;//对两个适配器清零arrayAdapter2.clear();arrayAdapter3.clear();// 获取点击的省份province = list.get(index1);// 遍历制作城市list2for (City tc : province.getCitys()) {list2.add(tc.getName());}//遍历制作地区list3for (String ts : province.getCitys().get(0).getDistricts()) {list3.add(ts);}// 对2号适配器重新赋值arrayAdapter2 = new ArrayAdapter<String>(MainActivity.this,layOutId,list2);spinner2.setAdapter(arrayAdapter2);arrayAdapter3 = new ArrayAdapter<String>(MainActivity.this,layOutId, list3);spinner3.setAdapter(arrayAdapter3);}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id) {arrayAdapter3.clear();index2 = position;// 获取点击的城市city = list.get(index1).getCitys().get(index2);// 遍历制作地区list3for (String ts : city.getDistricts()) {list3.add(ts);}// 对3号适配器重新赋值arrayAdapter3 = new ArrayAdapter<String>(MainActivity.this,layOutId, list3);spinner3.setAdapter(arrayAdapter3);}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});}public void parser1() {// 创建解析器,并制定解析的xml文件XmlResourceParser parser = getResources().getXml(R.xml.citys_weather);try {int type = parser.getEventType();while (type != XmlResourceParser.END_DOCUMENT) {String tag = parser.getName();// 获得标签名switch (type) {case XmlResourceParser.START_DOCUMENT:list = new ArrayList<Province>();break;case XmlResourceParser.START_TAG:switch (tag) {case "pn":province = new Province();province.setName(parser.nextText());break;case "cn":city = new City();city.setName(parser.nextText());break;case "d":city.getDistricts().add(parser.nextText());break;default:break;}break;case XmlResourceParser.END_TAG:if ("c".equals(tag)) {province.getCitys().add(city);}if ("p".equals(tag)) {list.add(province);}break;default:break;}type = parser.next();}} catch (XmlPullParserException e) {// TODO Auto-generated catch blocke.printStackTrace();}/** catch (FileNotFoundException e) { // TODO Auto-generated catch block* e.printStackTrace(); }*/catch (NumberFormatException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
province代码
public class Province {// 省份内private String name;private List<City> citys;public Province() {citys = new ArrayList<City>();}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<City> getCitys() {return citys;}public void setCitys(List<City> citys) {this.citys = citys;}}
City代码
public class City {private String name;private List<String> districts;public City(){districts = new ArrayList<String>();}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<String> getDistricts() {return districts;}public void setDistricts(List<String> districts) {this.districts = districts;}}
布局文件
<LinearLayout xmlns: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"tools:context="${relativePackage}.${activityClass}" ><Spinner
android:id="@+id/s1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:spinnerMode="dropdown" ></Spinner><Spinner
android:id="@+id/s2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:spinnerMode="dropdown" ></Spinner><Spinner
android:id="@+id/s3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:spinnerMode="dropdown" ></Spinner></LinearLayout>
这篇关于基于Spinner的省市县三级联动选择显示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!