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 ...
随机推荐
- 白话SpringCloud | 第十章:路由网关(Zuul)进阶:过滤器、异常处理
前言 简单介绍了关于Zuul的一些简单使用以及一些路由规则的简单说明.而对于一个统一网关而言,需要处理各种各类的请求,对不同的url进行拦截,或者对调用服务的异常进行二次处理等等.今天,我们就来了解下 ...
- bzoj 5305: [Haoi2018]苹果树
Description Solution \(n\) 个点的二叉树的方案数是 \(n!\) 证明十分显然:新加入的点占掉了 \(1\) 个位置,新加了 \(2\) 个位置,那么多出来一个位置,所以第 ...
- 上下文(Context)和作用域(Scope)
函数的每次调用都有与之紧密相关的作用域和上下文.从根本上来说,作用域是基于函数的,而上下文是基于对象的. 换句话说,作用域涉及到所被调用函数中的变量访问,并且不同的调用场景是不一样的.上下文始终是th ...
- js获取文件输入框的真实目录
1.问题 页面有一个input file服务器控件,一个div,div是image标签的容器,当点击input file的值改变,我们往div里追加image标签: 但当通过js的onchange事件 ...
- 如何查询日志文件中的所有ip,正则表达式
IPV4必须满足以下四条规则: 1.任何一个1位或2位数字,即0-99: 2.任何一个以1开头的3位数字,即100-199: 3.任何一个以2开头.第2位数字是0-4之间的3位数字,即200-249: ...
- 数据库中char、varchar、varchar2、nvarchar之间的关系
符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时 ...
- linux下(ubuntu)反删除(误删恢复)与回收站制作
刚刚有个小伙伴不小心删了他写了好几的天代码,为他心疼之余帮他找回了文件. 想到我之前也常常误删一些文件,就干脆分享一下我的反删除方法,并说说我做的回收站(好low的,求大神指点) 首先是反删除软件ex ...
- 理解JavaScript作用域
这是一篇译文,这里贴上译文地址:http://www.zcfy.cc/article/understanding-scope-in-javascript-8213-scotch-4075.html 这 ...
- Java的输入/输出操作
Java的输入\输出机制 计算机的基本功能就是通过输入输出设备与外部其他设备尽心数据的交互,从其他设备读入数据叫做输入操作,将计算机内的数据写入到其他设备叫做输出操作.可以向计算机发送数据.又可以接受 ...
- Daemon 自更新
NSTask *task = [[NSTask alloc] init]; [task setLaunchPath:@"usr/bin/dpkg"]; [task setArgum ...