使用popupwindow和wheelview实现的省市县(年月日)三级联动选择器
前言
在很多app中都有选择地址和选择出生年月日的功能,在这里我们使用popupwindow和自定义的wheelview来实现该功能。
话不多说先上效果图:
该项目的githup地址为:https://github.com/gumaoqi/datePickerPopupwindow
你可以去将项目clone下来,然后查看或更改来达到自己的需求,后续只会贴出部分重要的代码
代码结构图
libs下添加了fastjson.jar,用来解析txt,可以将json的数据直接转成Arraylist。
assets下放了province.txt,该文件包含了所有的省市县的信息,格式为json,是我们的数据来源
entity下放了province的实体,根据json格式的数据自动生成
widget下自定义了Wheelview以及它的dapter和listener(网上找的别人实现的wheelview)
com.yrtech.datepickerpopupwindow下定义了主活动MainActivity和我们的popuopwindow
具体代码
MainActivity.java
public class MainActivity extends AppCompatActivity {
@BindView(R.id.pick_date_tv)
TextView pickDateTv;//地址选择器的文本框
@BindView(R.id.pick_date_cl)
ConstraintLayout pickDateCl;//布局
Handler handler;//用以实现后续操作
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
handler = new Handler(new Handler.Callback() {//通过handler改变textview的值
@Override
public boolean handleMessage(Message msg) {
pickDateTv.setText((String) msg.obj);
return false;
}
});
}
@OnClick(R.id.pick_date_cl)
public void onViewClicked() {//弹出popuopwindow
DatePickerPopupwindow datePickerPopupwindow = new DatePickerPopupwindow(MainActivity.this, handler);
datePickerPopupwindow.showAtLocation(pickDateCl, Gravity.BOTTOM, 0, 0);
}
}
活动中只有一个textview,点击页面即可弹出popupwindow
DatePickerPopupwindow.java的重要代码
popupwindowDatePickerFirstWv.addChangingListener(new OnWheelChangedListener() {//设置一级联动,当省改变时,对应的市,县改变
@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
secondList.clear();
for (Province.CityBean cityBean : provinceList.get(newValue).getCity()) {
secondList.add(cityBean.getName());
}
secondStrericWheelAdapter = new StrericWheelAdapter(secondList);
popupwindowDatePickerSecondWv.setAdapter(secondStrericWheelAdapter);
provinceValue = newValue;
thirdList.clear();
for (String area : provinceList.get(provinceValue).getCity().get(0).getArea()) {
thirdList.add(area);
}
thirdStrericWheelAdapter = new StrericWheelAdapter(thirdList);
popupwindowDatePickerThirdWv.setAdapter(thirdStrericWheelAdapter);
popupwindowDatePickerSecondWv.setCurrentItem(0);
popupwindowDatePickerThirdWv.setCurrentItem(0);
}
});
popupwindowDatePickerSecondWv.addChangingListener(new OnWheelChangedListener() {//设置二级联动,当市改变时,对应的县改变
@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
thirdList.clear();
for (String area : provinceList.get(provinceValue).getCity().get(newValue).getArea()) {
thirdList.add(area);
}
thirdStrericWheelAdapter = new StrericWheelAdapter(thirdList);
popupwindowDatePickerThirdWv.setAdapter(thirdStrericWheelAdapter);
popupwindowDatePickerThirdWv.setCurrentItem(0);
}
});
三级联动代码,当滑动省名时,市名、县名改变;当滑动市名时,县名改变。
后记
实现的省市县三级联动后,类似的年月日三级联动就很简单了,只是数据不同而已。如果你已经熟悉了本项目,对应的单个wheelview实现民族,工作等选择器相信已不在话下。
本篇文章的主要目的为:记录某个功能的实现方法,以便日后查询。如果阅读后对你有所帮助,我将深感荣幸。
博主水平有限,如有指正错误和其他建议请在评论区留言。