最新Android简单实现省市区三级联动

这是本人第一次写博客,也是本人的第一篇博客!
有什么不足之处,希望大家多多见谅、互相请教!
本人Android新手上路,大神请轻吐槽!!!!!

省市级三级联动相信大家已经很熟悉了,网购的时候选地址就要用到这个功能。
我在网上看了很多篇关于Android省市区三级联动的文章。
个人感觉理解起来比较乱,不是很清晰,所以就打算自己写一篇,希望可以帮助到大家学习。

废话不多说,进入正题!!!

首先看一下效果图
在这里插入图片描述
虽然UI看起来有点简陋
但不影响功能的实现哈!!!

首先我用的是Json数据,通过不断地解析数据来实现显示的。

一、在项目目录的main目录下创建assets文件夹用来保放Json全国省市区数据txt文件

二、直接上xml布局代码、布局的话没什么好说的

<LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginBottom="10dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="省份:   " />

        <Spinner
            android:id="@+id/province"
            android:layout_width="100dp"
            android:layout_height="wrap_content">
        </Spinner>


    </LinearLayout>


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginBottom="10dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="市区:   "/>

        <Spinner
            android:id="@+id/city"
            android:layout_width="100dp"
            android:layout_height="wrap_content">
        </Spinner>


    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginBottom="10dp">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="地区:   "/>

        <Spinner
            android:id="@+id/area"
            android:layout_width="100dp"
            android:layout_height="wrap_content">
        </Spinner>


    </LinearLayout>

三、定义三个列表用来分别存放省市区数据并且初始化

		province = findViewById(R.id.province);
        city = findViewById(R.id.city);
        area = findViewById(R.id.area);

        provinceList = new ArrayList<>();
        cityList = new ArrayList<>();
        areaList = new ArrayList<>();

四、
直接用BufferedReader读取txt文件
然后把内容用StringBuffer保存
最后用JSONArray保存这些字符串
关于Json的相关知识这里不多补充

循环遍历这个数组,读取第i个数组、并且把每个数组的名字name字段读取出来保存在一个变量里面
最后在添加到省份这个列表里面、然后创建适配器来绑定并且显示数据

        try {
            InputStream inputStream =getResources().getAssets().open("City.txt");
            BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer stringBuffer = new StringBuffer();
            String lines =bufferedReader.readLine();
            while (lines != null){
                stringBuffer.append(lines);
                lines =bufferedReader.readLine();
            }

            final JSONArray Data =new JSONArray(stringBuffer.toString());
            //循环这个文件数组、获取数组中每个省对象的名字
            for (int i = 0; i < Data.length(); i++){
                JSONObject provinceJsonObject = Data.getJSONObject(i);
                String provinceName = provinceJsonObject.getString("name");
                provinceList.add(provinceName);
            }

            //定义省份显示适配器
            ArrayAdapter<String> provinceAdapter = new ArrayAdapter<>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,provinceList);
            provinceAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
            province.setAdapter(provinceAdapter);

五、上面已经完成了省的显示
接下来是市级的显示
首先对省级的下拉框设置监听事件
注意!!关键的地方来了
通过监听当前的用户所选中的省份在Json数据中的位置position
来获取当前省份所下属的所有市级并且添加到城市列表中
最后还是通过适配器来显示数据

province.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    try {
                        //根据当前位置的省份所在的数组位置、获取城市的数组
                        JSONObject provinceObject = Data.getJSONObject(position);
                        final JSONArray cityArray = provinceObject.getJSONArray("city");

                        //更新列表数据
                        if (citylist != null){
                            citylist.clear();
                        }

                        for (int i = 0; i < cityArray.length(); i++){
                            JSONObject cityObj = cityArray.getJSONObject(i);
                            String cityName = cityObj.getString("name");
                            citylist.add(cityName);
                        }

                        ArrayAdapter<String> cityAdapter = new ArrayAdapter<>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,citylist);
                        cityAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
                        city.setAdapter(cityAdapter);

六、上面完成了市级的
最后是实现地区的数据显示,其实道理和上面都一样,这里直接上代码

city.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                            @Override
                            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                                try {
                                    //根据当前城市数组位置 获取地区数据
                                    JSONObject cityJsonObj = cityArray.getJSONObject(position);
                                    JSONArray areaJsonArray = cityJsonObj.getJSONArray("area");

                                    if (arealist != null){
                                        arealist.clear();
                                    }

                                    for (int i = 0; i < areaJsonArray.length(); i++){
                                        arealist.add(areaJsonArray.getString(i));
                                    }

                                    ArrayAdapter<String> areaAdapter = new ArrayAdapter<>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,arealist);
                                    areaAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
                                    area.setAdapter(areaAdapter);

好啦!!!
最后附上这个项目码云地址,关于Json数据可以在里面下载:https://gitee.com/Damonnn/Android_Spinner
最终的效果如开头的效果图,希望可以帮助到一些人
有什么问题希望大家可以提出来,有什么好的建议也可以提出来
我会虚心学习改进,谢谢大家!!!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值