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 ...
随机推荐
- js根据子目录数目显示父级目录
需求:<ul>中<li>数量为0,则不显示<ul>以及<b>:<div>中<ul>数量为0,则不显示<div> 1. ...
- [转]前端HTML-CSS规范
原文:http://www.cnblogs.com/whitewolf/p/4491707.html 黄金定律 一个项目应该永远遵循同一套编码规范! 不管有多少人共同参与同一项目,一定要确保每一行代码 ...
- mysql忘记root密码的解决方法
Windows下mysql忘记root密码的解决方法 1. 首先检查mysql服务是否启动,若已启动则先将其停止服务,可在开始菜单的运行,使用命令:net stop mysql 或者在windows任 ...
- 数组和矩阵(2)——Reshape the Matrix
In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new o ...
- log4j 配置详解
参考如下两个网址,讲的很详细,先看第一个再看第二个: log4j使用介绍:http://swiftlet.net/archives/683 java日志处理组件log4j--log4j.xml配置详解 ...
- asyncio标准库3 HTTP client example
import aiohttp import asyncio import async_timeout async def fetch(session, url): async with async_t ...
- 怎么看电脑有没有安装USB3.0驱动
1.首先要看主板是否带USB3.0接口. 2.然后计算机-属性-设备管理器-通用串行总线,就可以看到是否有安装USB3.0驱动
- Jerry的Fiori原创文章合集
我曾经于2014年10月到2016年5月工作于SAP CRM Fiori应用的开发团队, 我所在的团队负责下列这8个Fiori应用的维护和持续开发: My Opportunities My Tasks ...
- npm proxy设置网络代理 并使用taobao registry
npm config set https-proxy http://server:portnpm config set proxy http://server:port npm set registr ...
- 简单的PHP算法题
简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...