一、 准备数据
在网上找了一份xml的数据源,链接在这:http://pan.baidu.com/s/1pJoHosr
在res文件夹下新建一个xml文件夹,将解压得到的3个xml文件放进去。
二、 解析xml文件
先看一下xml文件吧,是这个格式的
<resources>
<Province ID="0" ProvinceName="请选择">请选择 </Province>
解析代码如下:
public ArrayList<Province> getProvincesInfo()
{
//设置xml解析器,为读取的数据创建ArrayList对象
XmlResourceParser xrp = getResources().getXml(R.xml.provinces);
ArrayList<Province> provinces = new ArrayList<>();
try
{
int eventType = xrp.getEventType();
while (eventType != XmlResourceParser.END_DOCUMENT)
{
//当内容标签开始时,读取相应标签的属性
if (eventType == XmlResourceParser.START_TAG && xrp.getName().equals("Province"))
{
String id = xrp.getAttributeValue(null, "ID");
String name = xrp.getAttributeValue(null, "ProvinceName");
provinces.add(new Province(Integer.parseInt(id), name));
}
eventType = xrp.next();
}
} catch (XmlPullParserException | IOException e)
{
e.printStackTrace();
}
xrp.close();
return provinces;
}
三、绑定数据
将数据信息读到ArrayList对象中就好办了,直接用ArrayAdapter绑定就可以了: //为控件绑定视图
Spinner spnProvince = (Spinner)findViewById(R.id.spnProvince);
//读取并绑定province数据
final ArrayList<Province> provinces = getProvincesInfo();
final ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,provinces);
spnProvince.setAdapter(adapter);
因为ArrayList对象中的数据为自定义的Province,在Spinner中显示时会调用toString()函数,所以要在Province中重写toString函数,返回省份名称。
城市、和区域的选择都要依赖于上级的信息,在读取城市信息的时候需要传入省份的ID,来获取对应的城市,可以在读取标签属性的时候,判断传入的PID与读取的PID是否相等,来获取城市列表。
四、设置监听,实现城市和区域选择
数据绑定玩之后,就要设置监听了。
省份数据,在Activity onCreate的时候读入;城市数据,在选择了省份之后读入;区域数据在选择了城市之后读入。设置spnProvince的监听如下,在监听中读取数据,初始化子控件:
//为Province设置监听
spnProvince.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
{
//初始化城市列表
initSpnCity((int) id);
//选中“请选择”时不设置地址显示
if (id == 0)
{
//清空City、District选项
strProvince = "";
strCity = "";
strDistrict = "";
} else
{
strProvince = provinces.get((int) id).getName();
}
//显示选中的地址
tvAddress.setText(ADDRESS_TITLE + " " + strProvince + " " + strCity + " " + strDistrict);
}
@Override
public void onNothingSelected(AdapterView<?>