Android菜鸟的成长笔记——Spinner 省市县三级地址选择

一、 准备数据

在网上找了一份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<?> 
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值