Android 中实现省市区的联动,在收货地址选择中用到

仿京东收货地址三级联动 声明 我没有用tabLayout(pageSlidingTabStrip) + viewpager  + fragment 如果用上面的方法实现 更加简单           我用的是  一个listview  去实现的该界面  代码是从项目中抽取的,没有整理的很细。 package com.basedemo.my.xi.basedemo.activity; import and 阅读详情

实现省市区的联动有两步:

0:第一步解析XML文件得到省的列表,当然了之前还需要创建省,市,区的实体类

使用Pull解析的时候,在START_TAG里面进行初始化,在END_TAG里面进行添加和重新赋值为null,
还有要注意的是最底层的节点<d> 在END_TAG里面是获取不到的,需要在START_TAG里面来进行添加和重新复制为null

1:第二步添加3个Spinner,代表省,市,区,然后实现通过省的选择控制市的显示,然后通过市的选择控制区的显示。就是给省,市添加setOnItemSelectedListener的监听方法,然后在回调中更新spinner 的数据,然后更新显示。


代码:Android 中省市区的联动


xml文件在代码里面的res-〉raw 文件夹里面

主体的代码:

package tech.androidstudio.provincecitydistrictdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

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

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

import tech.androidstudio.provincecitydistrictdemo.entity.City;
import tech.androidstudio.provincecitydistrictdemo.entity.District;
import tech.androidstudio.provincecitydistrictdemo.entity.Province;

public class MainActivity extends AppCompatActivity implements  AdapterView.OnItemSelectedListener {

    Spinner province_spinner;
    Spinner city_spinner;
    Spinner district_spinner;

    ArrayList<String> province_list;
    ArrayList<String> city_list;
    ArrayList<String> district_list;
    private ArrayList<Province> mProvinceList;
    private ArrayAdapter<String> province_adapter;
    private ArrayAdapter<String> city_adapter;
    private ArrayAdapter<String> district_adapter;

    //下面的两个参数用来标记选择的是哪一个省和城市,其实可以不用cityNumber的
    private int provinceNumber;
//    private int cityNumber;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            mProvinceList = getList();
            Log.d("Kodulf", "list " + mProvinceList.toString());
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //初始化 province 省
        province_spinner =(Spinner)findViewById(R.id.spinner_province);
        province_list= new ArrayList<String>();
        for(int i=0;i<mProvinceList.size();i++){
            province_list.add(mProvinceList.get(i).getProvinceName());
        }
        province_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,province_list);
        province_spinner.setAdapter(province_adapter);

        //初始化 city 城市
        city_spinner =(Spinner)findViewById(R.id.spinner_city);
        city_list= new ArrayList<String>();
        for(int i=0;i<mProvinceList.get(0).getCityList().size();i++){
            city_list.add(mProvinceList.get(0).getCityList().get(i).getCityName());
        }
        city_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,city_list);
        city_spinner.setAdapter(city_adapter);

        //初始化 district 区
        district_spinner =(Spinner)findViewById(R.id.spinner_district);
        district_list= new ArrayList<String>();
        for(int i=0;i<mProvinceList.get(0).getCityList().get(0).getDistrictList().size();i++){
            district_list.add(mProvinceList.get(0).getCityList().get(0).getDistrictList().get(i).getDistrictName());
        }
        district_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,district_list);
        district_spinner.setAdapter(district_adapter);


        //然后给province和city 添加监听器,distrcit 就不需要了,
        //TODO 注意了,如果这个Spinner 里面只有一个数据,例如北京的 city 只有北京,那么是不会出发onItemSelecte的的事件的
        province_spinner.setOnItemSelectedListener(this);
        city_spinner.setOnItemSelectedListener(this);
        //district_spinner.setOnItemSelectedListener(this);
    }


    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Log.d("Kodulf", "Click " + "parent=" + parent.toString() + " view=" + view.toString() + "position =" + position + " long id=" + id);
        int spinnerId = parent.getId();
        switch (spinnerId){
            case R.id.spinner_province:
                Log.d("Kodulf", "Province");
                //选择省以后,开始更新市的列表,并且设置provinceNumber的值
                provinceNumber=position;
                city_list.clear();
                for (int i=0;i<mProvinceList.get(position).getCityList().size();i++){
                    city_list.add(mProvinceList.get(position).getCityList().get(i).getCityName());
                }
                city_adapter.notifyDataSetChanged();

                //同时更新区,获取这个省的第一个市的信息,然后更新。
                district_list.clear();
                for (int i = 0; i < mProvinceList.get(position).getCityList().get(0).getDistrictList().size(); i++) {
                    district_list.add(mProvinceList.get(position).getCityList().get(0).getDistrictList().get(i).getDistrictName());
                }
                district_adapter.notifyDataSetChanged();

                break;
            case R.id.spinner_city:
                Log.d("Kodulf", "City");
                //选择市以后,开始更新区的列表,可以设置或者不设置cityNumber=position;

                district_list.clear();
                for (int i = 0; i < mProvinceList.get(provinceNumber).getCityList().get(position).getDistrictList().size(); i++) {
                    district_list.add(mProvinceList.get(provinceNumber).getCityList().get(position).getDistrictList().get(i).getDistrictName());
                }
                district_adapter.notifyDataSetChanged();

                break;
            case R.id.spinner_district:
                Log.d("Kodulf", "District");
                break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
     }



//Pull解析XML文件。
    public ArrayList<Province> getList() throws XmlPullParserException, IOException {
        ArrayList<Province> provinceList= new ArrayList<Province>();
        Province province=null;
        ArrayList<City> cityList=null;
        City city=null;
        ArrayList<District> districtList=null;
        District district = null;

        //使用Pull解析
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        XmlPullParser xmlPullParser = factory.newPullParser();
        //文件 在Raw文件夹里面
        InputStream inputStream = getResources().openRawResource(R.raw.citys_weather);
        xmlPullParser.setInput(inputStream, "utf-8");
        //开始解析
        int eventType = xmlPullParser.getEventType();
        while (eventType!=XmlPullParser.END_DOCUMENT){
            switch (eventType){
                case XmlPullParser.START_DOCUMENT:
                    Log.d("Kodulf","Start Document");
                    break;
                case XmlPullParser.START_TAG:
                    String nodeName = xmlPullParser.getName();
                    if("p".equals(nodeName)){
                        province= new Province();
                        cityList= new ArrayList<City>();//创建Province 的时候就要创建 这个CityList
//                        <p p_id = "01">
//                        <pn>北京</pn>
                        int attributeCount = xmlPullParser.getAttributeCount();
                        for (int i = 0; i < attributeCount; i++) {
                            String attributeName = xmlPullParser.getAttributeName(i);
                            if("p_id".equals(attributeName))
                                province.setProvinceId(xmlPullParser.getAttributeValue(i));
                        }
                    }else if("pn".equals(nodeName)){
                        String provinceName = xmlPullParser.nextText();
                        if(provinceName!=null){
                            province.setProvinceName(provinceName);
                        }
                    }else if("c".equals(nodeName)){
                        //<c c_id="0101">
//                        <cn>北京</cn>
                        city = new City();
                        districtList = new ArrayList<District>();//这个不能少。
                        int attributeCount = xmlPullParser.getAttributeCount();
                        for (int i = 0; i < attributeCount; i++) {
                            String attributeName = xmlPullParser.getAttributeName(i);
                            if("c_id".equals(attributeName))
                                city.setCityId(xmlPullParser.getAttributeValue(i));
                        }
                    }else if("cn".equals(nodeName)){
                        String cityName = xmlPullParser.nextText();
                        if(cityName!=null){
                            city.setCityName(cityName);
                        }
                    }else if("d".equals(nodeName)){
                        //<d d_id="101010101">北京</d>
                        district = new District();

                        int attributeCount = xmlPullParser.getAttributeCount();
                        for (int i = 0; i < attributeCount; i++) {
                            String attributeName = xmlPullParser.getAttributeName(i);
                            if("d_id".equals(attributeName))
                                district.setDistrictId(xmlPullParser.getAttributeValue(i));
                        }
                        String districtName = xmlPullParser.nextText();
                        if(districtName!=null)
                        district.setDistrictName(districtName);
                        //在这里直接添加
                        districtList.add(district);
                        district=null;
                    }
                    break;
                case XmlPullParser.END_TAG:
                    String nodeNameEnd = xmlPullParser.getName();
                    //TODO 怎么没有检测到 d呢?
                    if("d".equals(nodeNameEnd)){
                        Log.d("Kodulf","nodeNameEnd="+nodeNameEnd+" "+district.toString());

                    }else if("c".equals(nodeNameEnd)){
                        city.setDistrictList(districtList);
                        cityList.add(city);
                        city =null;
                    }else if("p".equals(nodeNameEnd)){
                        province.setCityList(cityList);
                        provinceList.add(province);
                        province=null;
                    }
                    break;
            }
            eventType=xmlPullParser.next();
        }

        return provinceList;
    }

}




Android中收货地址管理Demo Android 收货地址管理,城市选择为省市区三级联动最近公司在做一个电商平台,这里展示的是一个收货地址管理的功能,实现了省市区三级联动的集成,本Demo得力于网络提供的三级联动案例,特此感谢提供者。首先就是完成布局UI设计: UI布局代码:主页面布局:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android 阅读详情

相关推荐

自定义组合控件之省市区三级联动选择

自定义组合控件之省市区三级联动选择 需求 一般的购物网站都会有收件地址的填写,为了让用户快速输入自己想要的地址,将全国省市区地址预定好,用户只要动动手指选择就可以。 做这个组合控件之前,是由于项目的需要,就是做地址管理的模块,当时想模仿京东商城的实现,但时间和水平有限,所以将就的做了如下实现。 先罗列当时开发前后的设计思路 设计思路 地址管理模块 功能:

贤鱼 3567

Android城市选择器citypickerview

本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮助到您;🍅。

u014388322的专栏 2174

uniapp(全端兼容) - 详细实现省份/市区/县城区域/街道村庄同时四级联动picker选择器组件插件,附带四级联动数据结构及支持数据懒加载,只有选到时才动态加载,选择地址省市区级联滚动选择器示例

uni-app,城市位置地址选择,四级联动选择器,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,级联选择器,4级同时联动,最多能选择到村庄,级联,无限,教程,实现选中省市区镇,地区四联动,实现省市区镇四级联动选择器(地址选择)省市区街道四级,弹出层,带json数据结构,懒加载,动态数据,接口加载下级数据,省份市区,区县,乡镇,街道村庄,4级联动Select列选择器,picker地址联动,uniApp实现省市区镇四级联动选项弹出层,弹框,先选

✅ 精选推荐文章 5339

安卓开发级联显示菜单-省市区显示举例

本文介绍了安卓开发过程实现级联显示的一种方案

baorant24的博客 1369

经典Android省市区三级联动源代码实现

本文还有配套的精品资源,点击获取 简介:本篇介绍如何在Android开发中实现省市区三级联动功能,包括数据结构设计、UI组件选择、Adapter实现、事件监听处理、动态数据加载及用户交互优化等关键环节。文章详细讲解了三级联动的逻辑和实践方法,目的是帮助开发者构建一个高效且用户友好的地址选择器,适用于地址选择和定位服务等场景。 1. 省市区三级联动概念 在现代...

weixin_28771751的博客 1223

实现Android省市区三级联动的实战教程与数据

简介:在Android开发中,三级联动功能对于地址选择等场景至关重要。本文将详细解释三级联动概念及实现方法,包括数据准备、UI设计、事件监听、数据绑定、适配器更新、异常处理和性能优化。提供了一个包含真实省市区数据的示例项目,帮助开发者理解并掌握三级联动技术。

weixin_35749796的博客 475

一篇文章,全面解读Android面试知识点

文章会持续更新的。绝对干货!!!Android进阶学习全套手册关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。

m0_74931167的博客 425

Android地名选择器 全国省市区选择器 城市选择 区县选择

Android全国地名选择 城市选择器 地名选择器 省市区选择

Android省市区三级联动滚轮选择(真实项目中提取出来的组件)

最近项目要做一个,类似淘宝手机客户端的,选择收货地址的三级联动滚动选择组件,下面是它的大致界面截图: 在IOS中有个叫UIPickerView的选择器,并且在dataSource中定义了UIPickerView的数据源和定制内容,所以用只要熟悉它的基本用法,要实现这么个三级联动滑动选择是挺简单的。  言归正传,今天讨论的是在Android里面如何来实现这么个效果,那么如何实现呢

WILLIAM-HUAN 个人技术博客 12万+

Android开发之二级联动下拉框

运用面向对象的思想,通过XML或其它方式,灵活的调整省份和城市的数据,以此实现联动下拉框的数据装配

CentOS 7下Oracle 11G RAC静默安装避坑指南:从网络规划到共享存储配置全流程

本文详细介绍了在CentOS 7环境下进行Oracle 11G RAC静默安装的全流程,包括网络规划、共享存储配置和系统参数调优等关键步骤。特别针对静默安装过程中的常见问题提供了实用的避坑指南和优化建议,帮助技术人员高效完成企业级数据库部署。

weixin_29234509的博客 124

android省市区三级联动,NumberPicker实现省市区三级联动的效果

github地址一、简介由于近期项目中要做选择收货地址的三级联动滚动选择的效果,所以选择了Numberpicker来做。下面就来讲讲我的实现办法。二、实现步骤1、由于收货地址需要用到“省市区”的数据源,所以我先把一个已经做好了的数据库文件放在project下的assets目录下,然后在app初始化的的时候,把assets下的数据库文件拷贝到真机的本地的data/data/包名/databases目...

weixin_35888497的博客 736

Windows系统下AutoDock 4.2.6安装避坑指南(附MGLTools配置技巧)

本文详细介绍了在Windows系统下安装和配置AutoDock 4.2.6的完整流程,特别针对分子对接研究中常见的软件安装问题提供了解决方案。从环境准备、分步安装到常见报错处理,涵盖MGLTools配置技巧、工作目录设置和环境变量优化,帮助科研人员快速搭建稳定的分子对接平台。

weixin_29234239的博客 313

CityPicker:Android 省市区三级联动地址选择器,开箱即用

在 Android 开发里,省市区三级联动是绕不开的高频需求。CityPicker 是一款开箱即用的省市区选择器,内置完整的行政区域数据,提供仿 iOS 滚轮、仿京东列表等多种样式,几行依赖即可集成。 ## 解决什么痛点:别再为省市区重复造轮子 做收货地址、用户资料页,省市区联动往往得自己从头写。行政数据从哪拿、怎么保持更新,都是隐形成本。各家实现风格不一,UI 还容易不统一。与其重复造轮子,

gitblog_00857的博客 129

保姆级教程:在PX4 Gazebo仿真中为Iris无人机挂载Intel D435i深度相机(含完整配置流程)

本文提供在PX4 Gazebo仿真环境中为Iris无人机挂载Intel D435i深度相机的完整配置流程,涵盖环境准备、模型部署、插件安装及调试技巧。通过详细步骤和常见问题解决方案,帮助开发者快速搭建深度相机仿真环境,适用于无人机视觉开发与算法测试。

weixin_28688385的博客 335

软件测试——白盒测试实验报告,输入年月日算星期几

软件测试——白盒测试实验报告,输入年月日算星期几,测试用例设计和结果展示

weixin_52278161的博客 2746

Android仿京东收货地址

Android仿京东三级联动收货地址 1.在本地新建assets目录,存放三级联动json数据,去本地json数据作为数据源 String data = com.miles.zcstc.fingerdemo.JsonParser.getJson(context, "city.json"); JsonParser jsonParser = new JsonParser(); JsonArray ...

qq_31765817的博客 1353

26 硬件工程师笔面试高频考点真题解析——CAN总线

CAN总线是一种差分多主串行半双工总线,采用非破坏性位仲裁机制和五层硬件错误检测(位错误、填充错误、CRC校验、格式错误、应答错误),具有高可靠性和故障容错能力。关键设计包括两端120Ω终端电阻匹配阻抗、手拉手总线拓扑、显性/隐性电平优先级仲裁。常见故障分析指出多节点异常多因终端电阻错配/漏装、星型布线违规或总线过载;高速通讯失败常由阻抗失配或线缆过长导致信号反射。相比RS485,CAN支持多主架构、硬件自动仲裁和节点故障隔离,更适用于汽车、工业等高可靠场景。

XU157303764的博客 547

Android选择器开发终极指南:打造iOS风格的多级联动选择器

想要在Android应用中快速实现优雅的选择器功能吗?Android-PickerView正是你需要的解决方案!这个强大的开源库提供了完整的iOS风格选择器组件,让你轻松构建时间选择、选项选择、省市区联动等多种交互场景。无论你是初学者还是经验丰富的开发者,本指南都将带你深入了解这个实用的开发工具。 ## 🚀 快速上手:5分钟集成选择器 Android-PickerView的集成非常简单,只需

gitblog_00667的博客 1105

静态时序分析(Static Timing Analysis, STA):简介及内容导航

静态时序分析(简称STA)是用来验证数字设计时序的技术之一,另外一种验证时序的方法是时序仿真,时序仿真可以同时验证功能和时序。“时序分析”这个术语就是用来指代“静态时序分析“或”时序仿真“这两种方法之一,简单来说,时序分析的目的就是为了解决设计中的各种时序问题。STA被称为静态的原因是其对于设计的分析是静态地执行的,并不依赖于施加在输入端口上的激励。相比之下,时序仿真则可以被视作动态地执行对设计的分析,具体过程描述如下:施加一组激励,观察在这组激励下电路行为是否符合要求,然后换一组激。

Starry__的博客 1990

垂直领域论坛数据挖掘:Python突破Discuz!加密与用户画像构建指南

在垂直领域论坛,如专业技术论坛、兴趣爱好社区等,积累了大量有价值的信息和用户数据。这些数据不仅可以帮助我们了解用户的行为模式和兴趣点,还能为社区运营、产品优化、商业决策等提供有力支持。然而,许多基于Discuz!系统的论坛对数据进行了加密保护,给数据挖掘带来了一定的挑战。本文将详细探讨如何使用Python突破Discuz!论坛的加密机制,并构建用户画像,实现数据掘金。

u014481728的博客 1693

Android 城市选择器:省市区三级联动,三行代码搭起来

收货地址页是多数电商 App 绕不过的页面,而省市区三级联动的数据与控制,往往是最耗时间的一环。CityPicker 是 Android 城市选择器里一个比较有代表性的开源项目,它把数据和控制封装在同一个库里,电商、本地生活类 App 的地址选择页常用这类组件来搭。 📦 开箱能做这些 - 内置全国县以上行政区划数据,初始化时自动解析,省掉自己找数据、清洗、建三级映射的环节 - 4 种现成 UI

gitblog_01066的博客 173

北斗导航 | 基于matlab的卫星导航单点定位算法

单点定位(Single Point Positioning, SPP)通过接收机观测至少4颗卫星的伪距(含误差的距离测量值),解算接收机位置(经度、纬度、高度)及钟差。HDOP < 2 为高精度定位条件。

尘世冰封的专栏 969

Android 省市区三级联动城市选择器 CityPicker 完整集成指南

每个 App 几乎都要做收货地址,省市区三级联动地址选择往往是复制粘贴来的,数据源还要自己维护。开源组件 CityPicker 省市区城市选择器把这个环节做成了开箱即用的方案。 ## 这个组件解决什么问题 省市区选择通常要自己管行政数据、自己画滚轮和列表,费时且容易出错。CityPicker 由开发者 crazyandcoder 封装,内置最新省市区行政数据,直接引入即可弹出选择器;最大卖点是

gitblog_00242的博客 182

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android地址控件,Android省市区三级联动控件使用方法实例讲解

最近有需求需要实现省市区三级联动,但是发现之前的实现不够灵活,自己做了一些优化。为了方便以后使用,抽离出来放在了github上WheelView。同时把其核心库放在了JCenter中了,可以直接引用。也可以参考项目中的Demo进行引用下面介绍一下如何使用如果用的是AndroidStudio那么直接在build.gradle文件中添加依赖:dependencies {compile 'chuck.W...

weixin_31613447的博客 714

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

AndroidPicker地址选择器终极指南:省级、地市级及区县级三级联动选择

AndroidPicker地址选择器是一款功能强大的安卓选择器类库,专门用于实现省市区县地址联动选择功能。无论你是需要用户选择收货地址、注册信息还是其他地理位置相关数据,这个地址选择器都能提供完美的解决方案。🚀 ## 什么是AndroidPicker地址选择器? AndroidPicker地址选择器是一个专门为安卓应用设计的**省市区县地址联动选择器**,支持省市县、省区及市县等多种选择模式

gitblog_00184的博客 442

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: Spinner报错: java.lang.RuntimeException: setOnItemClickListener cannot be used with a spinner.
下一篇: Android五种常用数据的存储方式
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值