Android PickerView实现 * 联动效果
作者:Knick_Zhang 发布时间:2023-02-25 15:05:47
标签: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);
}
}
}
}
到此完毕,很简单的例子。
来源:https://blog.csdn.net/qq_33022345/article/details/53053767


猜你喜欢
- 本文实例为大家分享了Android高德地图marker自定义弹框窗口的具体代码,供大家参考,具体内容如下最终效果:1.gradle里添加高德
- Android Studio 打包 jar 及 aar 包创建工程 New -> Module -> Library在gradl
- 1、任何的高并发,请求总是会有一个顺序的2、java的队列的数据结构是先进先出的取值顺序3、BlockingQueue类(线程安全)(使用方
- Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用。个人体验来说,Recycler
- Spring AOP对嵌套方法不起作用今天在调研系统操作记录日志时,好多教程都是借助于Spring AOP机制来实现。于是也采用这种方法来实
- 实例如下:MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean(); &
- 在使用一些产品列如微信、QQ之类的,如果有新消息来时,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息来临了。但是,一般情
- 问答小剧场 以下会产生信息丢失的类型转换是( ) A.float a=10;
- 对于clear与new Map的区别。我们首先来看一个例子,本例子是我在实际开发中遇到的,需求就是讲map放入到list中,说白了就是lis
- 本文实例为大家分享了android自定义View实现五子棋的具体代码,供大家参考,具体内容如下先说一下吧,android的自定义View就是
- 在很多系统开发中,我们希望在指定的方法调用之前或者之后能打印出该方法的调用时间以及方法的出参和入参,就可以使用spring的AOP,还可以结
- 这篇文章主要介绍了MyBatis执行Sql的流程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 本文介绍的是关于Mybatis中用OGNL表达式处理动态sql的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:常用的Mybat
- @schedule 注解 是springboot 常用的定时任务注解,使用起来简单方便,但是如果定时任务非常多,或者有的任务很耗时
- 背景产品想对多次快速点击做一下优化,想要的效果就是双击不会打开多次但是从开发角度来说,我可以用kotlin的拓展方法来调整这个,但是之前的历
- 对于学习过C语言的朋友应该都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存
- 开篇Druid号称是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能。作为日常使用较多的数据库连接组件,纯粹个人兴趣研究下
- 一、简介现在的Android应用程序中,不可避免的都会使用到图片,如果每次加载图片的时候都要从网络重新拉取,这样不但很耗费用户的流量,而且图
- 1. 背景从JDK1.5开始,Java支持个数可变的形参,类似:public class ParamDemo { public static
- Android 实现会旋转的饼状统计图实例代码最近在做一个项目,由于有需要统计的需要,于是就做成了下面饼状统计图。 下图是效果图: 大致思路