GitHub有一个开源控件PickerView,可以实现三级联动的效果。虽然该控件使用非常简单,但是填充数据异常繁琐。GitHub上的Demo在填充数据的时候是一条一条地填充的,代码过于冗余。下面提供一种简便的方式来实现。

(1)在app目录下新建一个assets文件夹,将province_data.xml文件复制到该文件夹下,该XML文件里保存了全国的省市县的地址数据。

(2)使用SAX解析xml文件中的数据,并将数据填充到PickerView这个控件中。

—ProvinceModel—

public class ProvinceModel implements IPickerViewData

{

private String name;

private List cityList;

public ProvinceModel()

{

super();

}

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 getPickerViewText()

{

return name;

}

}

—CityModel—

public class CityModel implements IPickerViewData

{

private String name;

private List districtList;

public CityModel()

{

super();

}

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 name;

}

@Override

public String getPickerViewText()

{

return name;

}

}

—DistrictModel—

public class DistrictModel implements IPickerViewData

{

private String name;

private String zipcode;

public DistrictModel()

{

super();

}

public String getZipcode()

{

return zipcode;

}

public void setZipcode(String zipcode)

{

this.zipcode = zipcode;

}

public String getName()

{

return name;

}

public void setName(String name)

{

this.name = name;

}

@Override

public String toString()

{

return name;

}

@Override

public String getPickerViewText()

{

return name;

}

}

—XmlParserHandler—

public class XmlParserHandler extends DefaultHandler

{

/**

* 存储所有的解析对象

*/

private List provinceList = new ArrayList<>();

private ProvinceModel provinceModel = new ProvinceModel();

private CityModel cityModel = new CityModel();

private DistrictModel districtModel = new DistrictModel();

public XmlParserHandler(){}

public List getDataList()

{

return provinceList;

}

@Override

public void startDocument() throws SAXException

{

super.startDocument();

}

@Override

public void endDocument() throws SAXException

{

super.endDocument();

}

@Override

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException

{

if (qName.equals("province"))

{

provinceModel = new ProvinceModel();

provinceModel.setName(attributes.getValue(0));

provinceModel.setCityList(new ArrayList());

}

else if (qName.equals("city"))

{

cityModel = new CityModel();

cityModel.setName(attributes.getValue(0));

cityModel.setDistrictList(new ArrayList());

}

else if (qName.equals("district"))

{

districtModel = new DistrictModel();

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

{

super.characters(ch, start, length);

}

}

public class AddressAddActivity extends BaseActivity

{

private OptionsPickerView mCityPickerView;

private ArrayList mProvinces = new ArrayList<>();

private ArrayList> mCities = new ArrayList<>();

private ArrayList>> mDistricts = new ArrayList<>();

@Override

protected void onCreate(@Nullable Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

supportRequestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_address_add);

ViewUtils.inject(this);

init();

}

private void init()

{

initProvinceDatas();

try

{

//选项选择器

mCityPickerView = new OptionsPickerView(this);

mCityPickerView.setPicker( mProvinces, mCities, mDistricts, true);

mCityPickerView.setTitle("选择城市");

mCityPickerView.setCyclic(false, false , false);

mCityPickerView.setOnoptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {

@Override

public void onOptionsSelect(int options1, int option2, int options3)

{

String address = mProvinces.get(options1).getName() + " "

+ mCities.get(options1).get(option2) + " "

+ mDistricts.get(options1).get(option2).get(options3);

mTxtAddress.setText(address);

}

});

}

catch (Exception e)

{

e.printStackTrace();

}

}

@OnClick(R.id.ll_city_picker)

public void showpickerView(View view)

{

mCityPickerView.show();

}

protected void initProvinceDatas()

{

AssetManager asset = getAssets();

try

{

InputStream input = asset.open("province_data.xml");

SAXParserFactory spf = SAXParserFactory.newInstance();

SAXParser parser = spf.newSAXParser();

XmlParserHandler handler = new XmlParserHandler();

parser.parse(input , handler);

input.close();

//获取解析出来的数据

mProvinces = (ArrayList) handler.getDataList();

}

catch (Throwable e)

{

e.printStackTrace();

}

if (mProvinces != null)

{

for (ProvinceModel p : mProvinces)

{

List cities = p.getCityList();

//组装城市数据

mCities.add((ArrayList) cities);

ArrayList> dts = new ArrayList<>();

for (CityModel c : cities)

{

List districts = c.getDistrictList();

dts.add((ArrayList) districts);

}

mDistricts.add(dts);

}

}

}

}

到此完毕,很简单的例子。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android pickerview 多行,Android PickerView实现三级联动效果相关推荐

  1. 怎样使用pickerview来实现地址菜单的三级联动效果

    现在很多的app,尤其是电商类的app在添加地址功能里面一般都会使用地址的三级联动,那么它是怎么实现的呢?其实很简单,现在简单的介绍一下使用第三方的依赖来实现三级联动的效果. 1.开始编写 1).在m ...

  2. 简单的一个用javascript做的'省市区'三级联动效果

    2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transition ...

  3. [Python] PyQt5+Pycharm 实现省、市、区/县三级联动效果

    Pyhton版本3.6 联动效果由三个py文件组成:一个是ui界面.一个逻辑脚本和省.市.区/县的信息文件. 先放上省.市.区/县的信息文件. #!usr/bin/env python # -*-co ...

  4. js之省市区(县)三级联动效果

    省市区(县)三级联动效果,是我们软件开发比较常用的,特别是对一些crm,erp之类,当然也包括其他的后台管理系统,基本都涉及到,今天贴出这个常用的,方便个人复用和大家使用 <!DOCTYPE h ...

  5. php 把省市存入数据库,用JS做了个省市县三级联动效果可存入数据库的值老不对,有代码...

    用JS做了个省市县三级联动效果可存入数据库的值老不对,有代码,在线等 现在的问题是这样的,当我选好地址后就提交他到数据库中去,可是现在怎么修改提交到数据库中的值都是前面的那些编码,就不是后面的文字.要 ...

  6. jquery三级联动模糊查询_js相关:jQuery实现三级联动效果

    js相关:jQuery实现三级联动效果 发布于 2020-7-21| 复制链接 摘记: 很久没写了,顺带复习,写了一个jQuery实现的三级联动,供大家参考,具体内容如下 ```xhtml .. 很久 ...

  7. android 仿ios三级联动,仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果...

    Android-PickerView 注意事项.详请使用方式.更新日志等,请查看 Wiki文档 Wiki文档,Wiki文档,Wiki文档 !~ 重要的事情说三遍 对于使用上有任何疑问或优化建议等,欢迎 ...

  8. android tablelayout 多行,android – 自定义TableLayout,行中有多个TextView

    我想用这样的行来创建自定义TableLayout: 电视用于TextView,即我想在行中添加11个TextView: 每行以标题开头,然后我添加5对TextView,这样表格行就像屏幕一样宽. 这是 ...

  9. android ellipsize 多行,android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法...

    android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法 布局文件中的TextView属性 复制代码 代码如下: android:id="@+id/b ...

  10. android tablelayout 多行,Android入门户五篇之TableLayout (二)//生成10行,8列的表格

    当前位置:我的异常网» Android » Android入门户五篇之TableLayout (二)//生成10行,8 Android入门户五篇之TableLayout (二)//生成10行,8列的表 ...

最新文章

  1. mtrand.RandomState.randint low = high
  2. java.util.concurrent.FutureTask 源码
  3. Reddit如何使用Memcached来存储3TB的缓存数据--转
  4. AtCoder AGC031F Walk on Graph (图论、数论)
  5. 州 选择国家_青海的三大城市:海南州、海北州和海西州,谁的风景更美?
  6. c语言 typedef的用法
  7. apt-get更新软件包_如何使用Apt-fast加速软件包下载和更新
  8. 为数据计算提供强力引擎,阿里云文件存储HDFS v1.0公测发布
  9. bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班
  10. MySQL—赋权(grant)和回收权限(revoke)
  11. java ip地址转数字_ip地址与整数相互转换
  12. C#如何获取物理网卡,虚拟网卡,以及无线网卡
  13. 基于SSM的灾情发布平台
  14. 如何新建一个vue项目(图文详解)
  15. php自动发卡程序8.0_php自动发卡平台源码
  16. CSDN资源上传记录(持续更新)
  17. IDEA JetBrains Mono 字体安装
  18. 工程数学(线性代数)笔记
  19. .net中对象名无效问题解决
  20. 为什么28岁不能学java_28岁大龄人学java不是不可能

热门文章

  1. 毕业设计 - 基于JAVA人脸识别管理系统(人脸搜索与人脸库管理)
  2. VC6.0用file-open后,出现“MSDEV.EXE-应用程序错误 遇到问题需要关闭“
  3. 深入理解Nginx~网络连接的设置
  4. 聚焦设计交易与商业落地 DANG·DHUB设计师平台上线【图】_品牌资讯_服饰_太平洋时尚网...
  5. stm8s电机库vtimer_SetTimer()函数的使用
  6. 复杂c语言游戏程序代码,【计算机】c语言经典游戏代码分享!
  7. JavaScript实现(轮播图,随机数,抽名字游戏,广告循环文字)
  8. 控制理论与控制工程算计算机相关专业吗,控制理论与控制工程专业介绍
  9. 几何画板椭圆九种画法_几何画板怎么制作椭圆定义演示动画?
  10. JCreator 使用技巧