Android PickerView实现三级联动效果
时间:2022-07-28
本文章向大家介绍Android PickerView实现三级联动效果,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
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<CityModel cityList;
public ProvinceModel()
{
super();
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public List<CityModel getCityList()
{
return cityList;
}
public void setCityList(List<CityModel cityList)
{
this.cityList = cityList;
}
@Override
public String getPickerViewText()
{
return name;
}
}
—CityModel—
public class CityModel implements IPickerViewData
{
private String name;
private List<DistrictModel districtList;
public CityModel()
{
super();
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public List<DistrictModel getDistrictList()
{
return districtList;
}
public void setDistrictList(List<DistrictModel 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<ProvinceModel provinceList = new ArrayList< ();
private ProvinceModel provinceModel = new ProvinceModel();
private CityModel cityModel = new CityModel();
private DistrictModel districtModel = new DistrictModel();
public XmlParserHandler(){}
public List<ProvinceModel 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<CityModel ());
}
else if (qName.equals("city"))
{
cityModel = new CityModel();
cityModel.setName(attributes.getValue(0));
cityModel.setDistrictList(new ArrayList<DistrictModel ());
}
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<ProvinceModel mProvinces = new ArrayList< ();
private ArrayList<ArrayList<CityModel mCities = new ArrayList< ();
private ArrayList<ArrayList<ArrayList<DistrictModel 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<ProvinceModel ) handler.getDataList();
}
catch (Throwable e)
{
e.printStackTrace();
}
if (mProvinces != null)
{
for (ProvinceModel p : mProvinces)
{
List<CityModel cities = p.getCityList();
//组装城市数据
mCities.add((ArrayList<CityModel ) cities);
ArrayList<ArrayList<DistrictModel dts = new ArrayList< ();
for (CityModel c : cities)
{
List<DistrictModel districts = c.getDistrictList();
dts.add((ArrayList<DistrictModel ) districts);
}
mDistricts.add(dts);
}
}
}
}
到此完毕,很简单的例子。
以上就是本文的全部内容,希望对大家的学习有所帮助。
- MySQL错误修复:Table xx is marked as crashed and last (automatic?) repair failed
- PHP跨站脚本攻击(XSS)漏洞修复方法(一)
- Windows下获取网络连线实际名称,加强IP类设置脚本的兼容性
- Android APP 快速 Pad 化实现
- PHP彩蛋还是漏洞?expose_php彩蛋的触发和屏蔽方法
- 深入源码探索 ReactNative 通信机制
- PHP跨站脚本攻击(XSS)漏洞修复思路(二)
- WordPress发布文章自动同步到新浪微博(带特色图片)
- go http 服务器编程(1)
- Linux系统内存监控、性能诊断工具vmstat命令详解
- go http 服务器编程(2)
- 利用placeholder属性来添加输入框默认文字提示,提高用户体验
- Linux系统监控、诊断工具之top命令详解
- 【Dev Club分享】iOS黑客技术大揭秘
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- centOS7 NET模式设置静态Ip的方法步骤
- CentOS搭建PHP服务器环境简明教程
- CentOS7.2安装MySql5.7并开启远程连接授权的教程
- linux查看防火墙状态与开启关闭命令详解
- linux防火墙iptables规则的查看、添加、删除和修改方法总结
- Linux expect实现自动登录脚本实例代码
- scRNA-seq marker identification(一)
- 关于linux权限s权限和t权限详解
- centOS7 桥接模式设置静态Ip的方法步骤
- linux环境下卸载oracle 11g的过程
- Seurat包基本分析实战—文献图表复现
- ubuntu配置tftp服务的步骤小结
- CentOS7下GitLab跨大版本升级的方法
- 解决Linux system v 共享内存问题
- Linux下core文件的使用方法详解