android 省市区三级联动
最近项目,需要用到三级联动,在网上找了一些例子,进行了修改,实现,提炼出来了给大家分享
实现思路是在三个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 省市区三级联动的更多相关文章
- Android中使用开源框架citypickerview实现省市区三级联动选择
1.概述 记得之前做商城项目,需要在地址选择中实现省市区三级联动,方便用户快速的填写地址,当时使用的是一个叫做android-wheel 的开源控件,当时感觉非常好用,唯一麻烦的是需要自己整理并解析省 ...
- vue省市区三级联动
仿照小米之家做的一个省市区三级联动,先上代码: HTML: <template> <section class="myAddress"> <secti ...
- jQuery省市区三级联动插件
体验效果:http://hovertree.com/texiao/bootstrap/4/支持PC和手机移动端. 手机扫描二维码体验效果: 代码如下: <!DOCTYPE html> &l ...
- 省市区三级联动 pickerView
效果图 概述 关于 省市区 三级联动的 pickerView,我想大多数的 iOS 开发者应该都遇到过这样的需求.在遇到这样的需求的时候,大多数人都会觉的这个很复杂,一时无从下手.其实真的没那么复杂. ...
- JS省市区三级联动
不需要访问后台服务器端,不使用Ajax,无刷新,纯JS实现的省市区三级联动. 当省市区数据变动是只需调正js即可. 使用方法: <!DOCTYPE html><html>< ...
- ajax省市区三级联动
jdbc+servlet+ajax开发省市区三级联动 技术点:jdbc操作数据库,ajax提交,字符拦截器,三级联动 特点:局部刷新达到省市区三级联动,举一反三可以做商品分类等 宗旨:从实战中学习 博 ...
- QQ JS省市区三级联动
如下图: 首先写一个静态的页面: <!DOCTYPE html> <html> <head> <title>QQ JS省市区三级联动</title ...
- 省市区三级联动(二)JS部分简单版
通过对上一篇<省市区三级联动>的学习发现JScript部分省市区的填充代码几乎相同,所以可以写成一个函数. 注意:html部分和chuli.php部分不变 1.下拉列表填充可以写成带参数的 ...
- 从QQ网站中提取的纯JS省市区三级联动
在 http://ip.qq.com/ 的网站中有QQ自己的JS省市区三级联动 QQ是使用引用外部JS来实现三级联动的.JS如下:http://ip.qq.com/js/geo.js <!DOC ...
随机推荐
- mongo 多条件or
or语句 or b=2 > db.XXX.find({"$or":[{"a":1}, {"b":2}]}); 等于java mong ...
- SpringBoot集成JWT 实现接口权限认证
JWT介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的, 特别适用于分布式站点 ...
- java使用poi.3.10读取excel 2003 (xls格式)
最近在做一个Excel导入数据库的案例,整理文档出来供大家参考. 1.下载 最新的 poi http://poi.apache.org/download.html 2.解压 把相关jar包引进项 ...
- Xcode10 闪退问题
最新更新了iOS12,mac10.13.6,xcode10之后,打开之前的项目,只要进行import,xcode就会闪退.那么就来看一下解决方案: Xcode10 新增了一个构建系统起名“New Bu ...
- CSP学习之CryptoAPI初识
Crypto API目的就是提供开发者在windows下使用PKI的编程接口. Crypto 提供了很多的加解密相关函数,如编码.解码.加密解密,哈希,数字证书.证书管理证书存储等. 有关 ...
- 线程安全的Dictionary
线程安全的DictionaryConcurrentDictionary<TKey, TValue> 类
- 重构指南 - 封装集合(Encapsulate Collection)
封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...
- ThreadPoolExecutor实现原理
转载:https://blog.csdn.net/yanyan19880509/article/details/52718497 前言 做java开发的,一般都避免不了要面对java线程池技术,像to ...
- 函数进阶3 —— 生成器、yield from
今天我们在进一步了解一下,生成器. ①: def func(): print('这是函数func') return '函数func' func() 结果是 这是函数func ②: def func1( ...
- 原生js获取手机定位信息
<script type="text/javascript"> function Location() {}; Location.prototype.getLocati ...