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

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

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

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个高仿 IOS PickerView 控件的库。代码来自:https://github.com/saiwu-bigkoo/Android-PickerView ,在原有代码基础上进行封装,并提供了一些修改属性方法。后期如有时间,将会对原有代码进行优化。预览使用首先需要在 build.gradle 文件中添加依赖:dependencies {    compile 'com.airsaid.library:pickerviewlibrary:1.0.0' }添加好依赖后,重新同步工程。可根据需求使用如下选择器:城选择:        CityPickerView mCityPickerView = new CityPickerView(this);         // 设置点击外部是否消失 //        mCityPickerView.setCancelable(true);         // 设置滚轮字体大小 //        mCityPickerView.setTextSize(18f);         // 设置标题 //        mCityPickerView.setTitle("我是标题");         // 设置取消文字 //        mCityPickerView.setCancelText("我是取消文字");         // 设置取消文字颜色 //        mCityPickerView.setCancelTextColor(Color.GRAY);         // 设置取消文字大小 //        mCityPickerView.setCancelTextSize(14f);         // 设置确定文字 //        mCityPickerView.setSubmitText("我是确定文字");         // 设置确定文字颜色 //        mCityPickerView.setSubmitTextColor(Color.BLACK);         // 设置确定文字大小 //        mCityPickerView.setSubmitTextSize(14f);         // 设置头部背景 //        mCityPickerView.setHeadBackgroundColor(Color.RED);         mCityPickerView.setOnCitySelectListener(new CityPickerView.OnCitySelectListener() {             @Override             public void onCitySelect(String str) {                 Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();             }         });         mCityPickerView.show();时间选择: //     TimePickerView 同样有上面设置样式的方法         TimePickerView mTimePickerView = new TimePickerView(this, TimePickerView.Type.YEAR_MONTH_DAY);         // 设置是否循环 //        mTimePickerView.setCyclic(true);         // 设置滚轮文字大小 //        mTimePickerView.setTextSize(TimePickerView.TextSize.SMALL);         // 设置时间可选范围(结合 setTime 方法使用,必须在) //        Calendar calendar = Calendar.getInstance(); //        mTimePickerView.setRange(calendar.get(Calendar.YEAR) - 100, calendar.get(Calendar.YEAR));         // 设置选中时间 //        mTimePickerView.setTime(new Date());         mTimePickerView.setOnTimeSelectListener(new TimePickerView.OnTimeSelectListener() {             @Override             public void onTimeSelect(Date date) {                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA);                 Toast.makeText(MainActivity.this, format.format(date), Toast.LENGTH_SHORT).show();             }         });         mTimePickerView.show();选项选择:        OptionsPickerView<String> mOptionsPickerView = new OptionsPickerView<>(this);         final ArrayList<String> list = new ArrayList<>();         list.add("男");         list.add("女");         // 设置数据         mOptionsPickerView.setPicker(list);         // 设置选项单位 //        mOptionsPickerView.setLabels("性");         mOptionsPickerView.setOnOptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {             @Override             public void onOptionsSelect(int option1, int option2, int option3) {                 String sex = list.get(option1);                 Toast.makeText(MainActivity.this, sex, Toast.LENGTH_SHORT).show();             }         });         mOptionsPickerView.show();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值