最近项目,需要用到三级联动,在网上找了一些例子,进行了修改,实现,提炼出来了给大家分享

实现思路是在三个wheelview 进行联动。选择了省,马上就关联到市和区,选择了市 ,马上就可以关联到区。

效果图:



首先建了三个Model 用于存数据

存省 和市的list 和区的

public class ProvinceInfoModel {
private String name;
private List<CityInfoModel> cityList; public ProvinceInfoModel() {
super();
} public ProvinceInfoModel(String name, List<CityInfoModel> cityList) {
super();
this.name = name;
this.cityList = cityList;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<CityInfoModel> getCityList() {
return cityList;
} public void setCityList(List<CityInfoModel> cityList) {
this.cityList = cityList;
} @Override
public String toString() {
return "ProvinceInfoModel [name=" + name + ", cityList=" + cityList + "]";
}
}

存市和其对应的区list

public class CityInfoModel {

    private String name;
private List<DistrictInfoModel> districtList; public CityInfoModel() {
super();
} public CityInfoModel(String name, List<DistrictInfoModel> districtList) {
super();
this.name = name;
this.districtList = districtList;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<DistrictInfoModel> getDistrictList() {
return districtList;
} public void setDistrictList(List<DistrictInfoModel> districtList) {
this.districtList = districtList;
} @Override
public String toString() {
return "CityInfoModel [name=" + name + ", districtList=" + districtList
+ "]";
}
}

区的modeL

public class DistrictInfoModel {

    private String name;
private String zipcode; public DistrictInfoModel() {
super();
} public DistrictInfoModel(String name, String zipcode) {
super();
this.name = name;
this.zipcode = zipcode;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getZipcode() {
return zipcode;
} public void setZipcode(String zipcode) {
this.zipcode = zipcode;
} @Override
public String toString() {
return "DistrictInfoModel [name=" + name + ", zipcode=" + zipcode + "]";
} }

数据存储在xml中,在assets目录下,详情见源代码,代码太多了。

用的sax解析xml并得到数据存储在内存中

public class AddrXmlParser extends DefaultHandler {

    private List<ProvinceInfoModel> provinceList = new ArrayList<ProvinceInfoModel>();

    public java.util.List<ProvinceInfoModel> getDataList() {
return provinceList;
} @Override
public void startDocument() throws SAXException { } ProvinceInfoModel provinceModel = new ProvinceInfoModel();
CityInfoModel cityModel = new CityInfoModel();
DistrictInfoModel districtModel = new DistrictInfoModel(); @Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equals("province")) {
provinceModel = new ProvinceInfoModel();
provinceModel.setName(attributes.getValue(0));
provinceModel.setCityList(new ArrayList<CityInfoModel>());
} else if (qName.equals("city")) {
cityModel = new CityInfoModel();
cityModel.setName(attributes.getValue(0));
cityModel.setDistrictList(new ArrayList<DistrictInfoModel>());
} else if (qName.equals("district")) {
districtModel = new DistrictInfoModel();
districtModel.setName(attributes.getValue(0));
districtModel.setZipcode(attributes.getValue(1));
}
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equals("district")) {
cityModel.getDistrictList().add(districtModel);
} else if (qName.equals("city")) {
provinceModel.getCityList().add(cityModel);
} else if (qName.equals("province")) {
provinceList.add(provinceModel);
}
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
}
}

需要在activity 中开启线程读取数据

protected boolean readAddrDatas() {
List<ProvinceInfoModel> provinceList = null;
AssetManager asset = getAssets();
try {
InputStream input = asset.open("province_data.xml");
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser parser = spf.newSAXParser();
AddrXmlParser handler = new AddrXmlParser();
parser.parse(input, handler);
input.close();
provinceList = handler.getDataList();
if (provinceList != null && !provinceList.isEmpty()) {
mCurrentProviceName = provinceList.get(0).getName();
List<CityInfoModel> cityList = provinceList.get(0).getCityList();
if (cityList != null && !cityList.isEmpty()) {
mCurrentCityName = cityList.get(0).getName();
List<DistrictInfoModel> districtList = cityList.get(0).getDistrictList();
mCurrentDistrictName = districtList.get(0).getName();
}
}
mProvinceDatas = new ArrayList<String>();
for (int i = 0; i < provinceList.size(); i++) {
mProvinceDatas.add(provinceList.get(i).getName());
List<CityInfoModel> cityList = provinceList.get(i).getCityList();
ArrayList<String> cityNames = new ArrayList<String>();
for (int j = 0; j < cityList.size(); j++) {
cityNames.add(cityList.get(j).getName());
List<DistrictInfoModel> districtList = cityList.get(j).getDistrictList();
ArrayList<String> distrinctNameArray = new ArrayList<String>();
DistrictInfoModel[] distrinctArray = new DistrictInfoModel[districtList.size()];
for (int k = 0; k < districtList.size(); k++) {
DistrictInfoModel districtModel = new DistrictInfoModel(districtList.get(k).getName(), districtList.get(k).getZipcode());
distrinctArray[k] = districtModel;
distrinctNameArray.add(districtModel.getName());
}
mDistrictDatasMap.put(cityNames.get(j), distrinctNameArray);
}
mCitisDatasMap.put(provinceList.get(i).getName(), cityNames);
}
return true;
} catch (Throwable e) {
e.printStackTrace();
return false;
}
}

读取完数据需要设置weelview 的数据


mProvincePicker.setOnSelectListener(new WheelView.OnSelectListener() {
@Override
public void endSelect(int id, String text) {
String provinceText = mProvinceDatas.get(id);
if (!mCurrentProviceName.equals(provinceText)) {
mCurrentProviceName = provinceText;
ArrayList<String> mCityData = mCitisDatasMap.get(mCurrentProviceName);
mCityPicker.resetData(mCityData);
mCityPicker.setDefault(0);
mCurrentCityName = mCityData.get(0); ArrayList<String> mDistrictData = mDistrictDatasMap.get(mCurrentCityName);
mCountyPicker.resetData(mDistrictData);
mCountyPicker.setDefault(0);
mCurrentDistrictName = mDistrictData.get(0);
}
} @Override
public void selecting(int id, String text) {
}
});

代码不一一写成,详情见源码。

源码下载

android 省市区三级联动的更多相关文章

  1. Android中使用开源框架citypickerview实现省市区三级联动选择

    1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省 ...

  2. vue省市区三级联动

    仿照小米之家做的一个省市区三级联动,先上代码: HTML: <template> <section class="myAddress"> <secti ...

  3. jQuery省市区三级联动插件

    体验效果:http://hovertree.com/texiao/bootstrap/4/支持PC和手机移动端. 手机扫描二维码体验效果: 代码如下: <!DOCTYPE html> &l ...

  4. 省市区三级联动 pickerView

    效果图 概述 关于 省市区 三级联动的 pickerView,我想大多数的 iOS 开发者应该都遇到过这样的需求.在遇到这样的需求的时候,大多数人都会觉的这个很复杂,一时无从下手.其实真的没那么复杂. ...

  5. JS省市区三级联动

    不需要访问后台服务器端,不使用Ajax,无刷新,纯JS实现的省市区三级联动. 当省市区数据变动是只需调正js即可. 使用方法: <!DOCTYPE html><html>< ...

  6. ajax省市区三级联动

    jdbc+servlet+ajax开发省市区三级联动 技术点:jdbc操作数据库,ajax提交,字符拦截器,三级联动 特点:局部刷新达到省市区三级联动,举一反三可以做商品分类等 宗旨:从实战中学习 博 ...

  7. QQ JS省市区三级联动

    如下图: 首先写一个静态的页面: <!DOCTYPE html> <html> <head> <title>QQ JS省市区三级联动</title ...

  8. 省市区三级联动(二)JS部分简单版

    通过对上一篇<省市区三级联动>的学习发现JScript部分省市区的填充代码几乎相同,所以可以写成一个函数. 注意:html部分和chuli.php部分不变 1.下拉列表填充可以写成带参数的 ...

  9. 从QQ网站中提取的纯JS省市区三级联动

    在 http://ip.qq.com/ 的网站中有QQ自己的JS省市区三级联动 QQ是使用引用外部JS来实现三级联动的.JS如下:http://ip.qq.com/js/geo.js <!DOC ...

随机推荐

  1. VueConf 全球首届Vue.js开发者大会资料整理

    最近一直关注VueConf全球首届Vue.js开发者大会,现在将此次开发者大会资料整理如下: 一.Vue 2017 现状与展望   [尤雨溪] 在线视频: PPT整理: Vue 2017 现状与展望 ...

  2. 将代码托管到github,并生成链接访问

    转眼间加入github的阵营已经两年多了,看到别人建立的个人博客挺好看的,因此,自己从此喜欢上了github,总结下自己的相关知识. 推荐学习Git的网址: 猴子都能懂的GIT入门 http://ba ...

  3. 02.switch的使用

    基本语法: switch-case语法: switch(表达式/变量) { case 值1: 语句块1; break; case 值2: 语句块2; break; default:语句块3; brea ...

  4. C# ObjectArx cad二次开发

    1 环境搭建:安装CAD 和objectArx库,这里安装的是cad2012和objectArx2010 ,vs是2010 2 新建一个类库项目,引用objectArx安装目录下inc文件夹下的AcD ...

  5. 【转载】图解MySQL MSI方式安装方法

    ********************************** 后来发现图片是百度的被封了.有空再换下吧. 一般百度经验这样的链接是不会失效的,大家可以百度查看. *************** ...

  6. Android 使用RecyclerView优雅实现悬浮标题通讯录

    项目地址:https://github.com/hgDendi/ContactsList 界面概览: ContactsListDemo ContactsListDemo2 概要 如图,主要简单划分为两 ...

  7. day006-多线程

    1. 线程概念 a)     什么是主线程 Java程序启动过程中自动创建的并执行main方法的线程称为主线程 主线程的执行路径: 从main方法开始到main方法结束 b)什么是子线程 除了主线程的 ...

  8. Linux(Ubuntu) 常用命令

    玩儿转Linux:终端命令用法精选 最近再一次拾起了Ubuntu,为了更好的玩儿转Linux,专门到网上搜到的这些常用的终端命令,根据命令使用类别的不同分为了9个大类,都在下面一一列举了出来,个人觉得 ...

  9. php调用含有命名空间的类

    现有a.php 和 b.php在同一个目录下 a.php中 namespace myspace; class A{ __construct(){} .... } b.php中调用类A require_ ...

  10. 诊断GRID无法启动问题

    诊断 Grid Infrastructure 启动问题 (文档 ID 1623340.1)