博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 省市区三级联动
阅读量:4364 次
发布时间:2019-06-07

本文共 7465 字,大约阅读时间需要 24 分钟。

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

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

效果图:

图片名称

首先建了三个Model 用于存数据
存省 和市的list 和区的

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

存市和其对应的区list

public class CityInfoModel {
private String name; private List
districtList; public CityInfoModel() { super(); } public CityInfoModel(String name, List
districtList) { super(); this.name = name; this.districtList = districtList; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List
getDistrictList() { return districtList; } public void setDistrictList(List
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
provinceList = new ArrayList
(); public java.util.List
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
()); } else if (qName.equals("city")) { cityModel = new CityInfoModel(); cityModel.setName(attributes.getValue(0)); cityModel.setDistrictList(new ArrayList
()); } 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
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
cityList = provinceList.get(0).getCityList(); if (cityList != null && !cityList.isEmpty()) { mCurrentCityName = cityList.get(0).getName(); List
districtList = cityList.get(0).getDistrictList(); mCurrentDistrictName = districtList.get(0).getName(); } } mProvinceDatas = new ArrayList
(); for (int i = 0; i < provinceList.size(); i++) { mProvinceDatas.add(provinceList.get(i).getName()); List
cityList = provinceList.get(i).getCityList(); ArrayList
cityNames = new ArrayList
(); for (int j = 0; j < cityList.size(); j++) { cityNames.add(cityList.get(j).getName()); List
districtList = cityList.get(j).getDistrictList(); ArrayList
distrinctNameArray = new ArrayList
(); 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
mCityData = mCitisDatasMap.get(mCurrentProviceName); mCityPicker.resetData(mCityData); mCityPicker.setDefault(0); mCurrentCityName = mCityData.get(0); ArrayList
mDistrictData = mDistrictDatasMap.get(mCurrentCityName); mCountyPicker.resetData(mDistrictData); mCountyPicker.setDefault(0); mCurrentDistrictName = mDistrictData.get(0); } } @Override public void selecting(int id, String text) { } });

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

转载于:https://www.cnblogs.com/forezp/p/9852224.html

你可能感兴趣的文章
bzoj 4555 求和
查看>>
Spring的工作原理
查看>>
四分树 (Quadtrees UVA - 297)
查看>>
Quartz 学习
查看>>
获取项目路径
查看>>
[第1组]头脑风暴+核心竞争力+功能集+NABCD
查看>>
E20180518-hm
查看>>
jwt vs session
查看>>
ThinkPHP关联模型详解
查看>>
(转)vue入门
查看>>
Ajax写分页查询(实现不刷新页面)
查看>>
CSS滚动条样式定制
查看>>
如何在linux下开启FTP服务
查看>>
Java实验报告(实验四)
查看>>
数据结构&图论:欧拉游览树
查看>>
自我介绍
查看>>
关于CSS绘制图形的转载
查看>>
IDEA更换背景颜色与字体
查看>>
vue-router
查看>>
js文字滚动效果实现
查看>>