安卓开发中spinner的三级联动

spinner 的三级联动用法

需求:将省,市,县从xml文档中解析出来,并展示到spinner控件中,当选中省级spinner时,相应的市级和县级会有相应的变化,选了省级以后再选市级,县级也会有相应的变化

方法:采用adapter链接数据源和控件,采用pull解析解析出数据,使用onItemSelectetListenner监听spinner的变化

(1)以下是xml文件中的部分代码,这里只做个样本




北京

   北京
北京
海淀
朝阳
顺义
怀柔
通州
昌平
延庆
丰台
石景山
大兴
房山
密云
门头沟
平谷





上海
上海
上海
闵行
宝山
嘉定
浦东南汇
金山
青浦
松江
奉贤
崇明
徐家汇
浦东





天津
天津
天津
武清
宝坻
东丽
西青
北辰
宁河
汉沽
静海
津南
塘沽
大港
蓟县





重庆
重庆
重庆
永川
合川
南川
江津
万盛
渝北
北碚
巴南
长寿
黔江
万州
涪陵
开县
城口
云阳
巫溪
奉节
巫山
潼南
垫江
梁平
忠县
石柱
大足
荣昌
铜梁
璧山
丰都
武隆
彭水
綦江
酉阳
秀山





黑龙江
哈尔滨
哈尔滨
双城
呼兰
阿城
宾县
依兰
巴彦
通河
方正
延寿
尚志
五常
木兰

齐齐哈尔
齐齐哈尔
讷河
龙江
甘南
富裕
依安
拜泉
克山
克东
泰来

牡丹江
牡丹江
海林
穆棱
林口
绥芬河
宁安
东宁

佳木斯
佳木斯
汤原
抚远
桦川
桦南
同江
富锦

绥化
绥化
肇东
安达
海伦
明水
望奎
兰西
青冈
庆安
绥棱

黑河
黑河
嫩江
孙吴
逊克
五大连池
北安

大兴安岭
大兴安岭
塔河
漠河
呼玛
呼中
新林
加格达奇

伊春
伊春
乌伊岭
五营
铁力
嘉荫

大庆
大庆
林甸
肇州
肇源
杜尔伯特

七台河
七台河
勃利

鸡西
鸡西
虎林
密山
鸡东

鹤岗
鹤岗
绥滨
萝北

双鸭山
双鸭山
集贤
宝清
饶河
友谊



(2)下面便是关键代码了

package com.example.day04spinner041;


import java.io.IOException;
import java.util.ArrayList;


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


import android.location.Address;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.res.XmlResourceParser;
import android.util.Xml;
import android.view.Menu;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;


public class MainActivity extends Activity {
private Spinner spprovince,spcity,spviLlage;
private ArrayList pidlist,pnamelist,cidlist,cnamelist,vidlist,vnamelist,allnamelist;
private ArrayAdapter provinceaddpter,cityadapter,villageadapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        spprovince=(Spinner) findViewById(R.id.spprovince);
        spcity=(Spinner) findViewById(R.id.spcity);
        spviLlage=(Spinner) findViewById(R.id.spvillage);
        
        getProvince();
        
        provinceaddpter=new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,pnamelist);
        cityadapter=new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line);
        villageadapter=new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line);
       
        spprovince.setAdapter(provinceaddpter);
       spcity.setAdapter(cityadapter);
       spviLlage.setAdapter(villageadapter);
       //spinner的监听事件
       spcity.setOnItemSelectedListener(new OnItemSelectedListener() {


@Override
public void onItemSelected(AdapterView parent, View view,
int position, long id) {
String cid=cidlist.get(position);
getVillage(cid);

villageadapter.clear();
villageadapter.addAll(vnamelist);

}




@Override
public void onNothingSelected(AdapterView parent) {
// TODO Auto-generated method stub

}
});
      
       spprovince.setOnItemSelectedListener(new OnItemSelectedListener() {



public void onItemSelected(AdapterView parent, View view,
int position, long id) {
String pid=pidlist.get(position);
getCity(pid);
cityadapter.clear();
cityadapter.addAll(cnamelist);

getVillage(cidlist.get(position));
villageadapter.clear();
villageadapter.addAll(vnamelist);


}


@Override
public void onNothingSelected(AdapterView parent) {
// TODO Auto-generated method stub

}
});
    }
//解析省级数据(xml解析)
public void getProvince() {
XmlResourceParser parser=getResources().getXml(R.xml.cities);
try {
int type=parser.getEventType();
while(type!=1){
String tag=parser.getName();
switch(type){
case 0:
pidlist=new ArrayList();
pnamelist=new ArrayList();
break;
case 2:
if("p".equals(tag)){
pidlist.add(parser.getAttributeValue(0));
}
if("pn".equals(tag)){
pnamelist.add(parser.nextText());
}
break;

}
type=parser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}

//解析市级数据
public void getCity(String pid) {
XmlPullParser parser=getResources().getXml(R.xml.cities);
try {
int type=parser.getEventType();
while(type!=1){
String tag=parser.getName();
switch(type){
case 0:
cidlist=new ArrayList();
cnamelist=new ArrayList();
break;
case 2:
if("c".equals(tag)){
String cid=parser.getAttributeValue(0);
if(cid.startsWith(pid)){
cidlist.add(cid);
parser.nextTag();
cnamelist.add(parser.nextText());
}
}

break;

}
type=parser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}



}

//解析县级数据
public void getVillage(String cid) {
    XmlPullParser parser=getResources().getXml(R.xml.cities);
    try {
    int type=parser.getEventType();
    while(type!=1){
    String tag=parser.getName();
    switch (type) {
    case 0:
    vidlist=new ArrayList();
    vnamelist=new ArrayList();
    
    break;
    
    case 2:
    if("d".equals(tag)){
    String vid=parser.getAttributeValue(0);
    if(vid.contains(cid)){
    vidlist.add(vid);
    vnamelist.add(parser.nextText());
    }
    }
    break;
    }
    type=parser.next();
    }
    } catch (XmlPullParserException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    
     }
    
}

你可能感兴趣的:(安卓开发中spinner的三级联动)