使用popupwindow和wheelview实现的省市县(年月日)三级联动选择器

前言 

在很多app中都有选择地址和选择出生年月日的功能,在这里我们使用popupwindow和自定义的wheelview来实现该功能。

话不多说先上效果图:

使用popupwindow和wheelview实现的省市县(年月日)三级联动选择器

该项目的githup地址为:https://github.com/gumaoqi/datePickerPopupwindow

你可以去将项目clone下来,然后查看或更改来达到自己的需求,后续只会贴出部分重要的代码

代码结构图

使用popupwindow和wheelview实现的省市县(年月日)三级联动选择器

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实现民族,工作等选择器相信已不在话下。

本篇文章的主要目的为:记录某个功能的实现方法,以便日后查询。如果阅读后对你有所帮助,我将深感荣幸。

博主水平有限,如有指正错误和其他建议请在评论区留言。