告别选择器碎片化:Android-PickerView实现时间与选项的统一管理方案

告别选择器碎片化:Android-PickerView实现时间与选项的统一管理方案

【免费下载链接】Android-PickerView 【免费下载链接】Android-PickerView 项目地址: https://gitcode.com/gh_mirrors/and/Android-PickerView

在Android开发中,日期选择、城市选择、商品分类等交互场景无处不在,但开发者往往需要为不同类型的选择器编写重复代码。Android-PickerView作为一款集成时间选择器(TimePickerView)和选项选择器(OptionsPickerView)的开源库,通过统一的API设计和灵活的配置能力,解决了选择器碎片化问题。本文将从实际应用场景出发,详解如何利用该库实现时间与选项选择的统一管理,减少80%的重复编码工作。

核心功能概览

Android-PickerView提供两类核心选择器,覆盖主流选择场景需求:

时间选择器(TimePickerView)

支持多维度时间组合,包括:

  • 年月日时分秒(完整模式)
  • 年月日(日期模式)
  • 年月(月份模式)
  • 时分(时间模式)
  • 农历/公历切换(扩展功能)

选项选择器(OptionsPickerView)

支持多级联动选择,特性包括:

  • 一/二/三级选项联动
  • 非联动模式配置
  • 自定义分隔线与间距
  • 循环滚动模式

时间选择器与选项选择器效果对比

核心实现类:TimePickerView | OptionsPickerView

快速集成指南

1. 引入依赖

通过Gradle集成库文件:

compile 'com.contrarywind:Android-PickerView:4.1.9'

如需自定义滚轮基础控件,可单独引入WheelView库:

compile 'com.contrarywind:wheelview:4.1.0'

2. 基础时间选择器实现

创建默认时间选择器仅需3行核心代码:

TimePickerView pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
    @Override
    public void onTimeSelect(Date date, View v) {
        Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();
    }
}).build();

完整示例代码:MainActivity.java

调用show()方法显示选择器,支持绑定触发视图:

pvTime.show(v); // 绑定按钮触发时,回调可关联该视图

3. 基础选项选择器实现

以城市选择为例,实现二级联动选择器:

OptionsPickerView pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
    @Override
    public void onOptionsSelect(int options1, int option2, int options3, View v) {
        String tx = options1Items.get(options1).getPickerViewText() 
                + options2Items.get(options1).get(option2);
        tvOptions.setText(tx);
    }
}).build();
pvOptions.setPicker(options1Items, options2Items); // 传入二级数据
pvOptions.show();

城市选择器联动效果

数据源构造示例:MainActivity.java

高级配置与定制

时间选择器精细化控制

通过TimePickerBuilder可配置20+种属性,满足个性化需求:

pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
    @Override
    public void onTimeSelect(Date date,View v) {
        tvTime.setText(getTime(date));
    }
})
.setType(new boolean[]{true, true, true, true, true, true}) // 年月日时分秒
.setRangDate(startDate,endDate) // 起始日期限制
.setLabel("年","月","日","时","分","秒") // 单位标签
.setDate(selectedDate) // 默认选中时间
.isCyclic(true) // 循环滚动
.isCenterLabel(false) // 标签是否只显示中间项
.build();

自定义时间选择器样式

农历模式实现:MainActivity.java

选项选择器高级特性

非联动模式配置

通过setLinkage(false)禁用联动,实现独立三级选择:

pvNoLinkOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
    @Override
    public void onOptionsSelect(int options1, int options2, int options3, View v) {
        String str = "food:" + food.get(options1) 
                + "\nclothes:" + clothes.get(options2)
                + "\ncomputer:" + computer.get(options3);
    }
})
.setLinkage(false) // 默认true,设置false取消联动
.build();
pvNoLinkOptions.setNPicker(food, clothes, computer); // 独立数据源
实时选择监听

添加选择变化监听器,实现动态响应:

.setOptionsSelectChangeListener(new OnOptionsSelectChangeListener() {
    @Override
    public void onOptionsSelectChanged(int options1, int options2, int options3) {
        String str = "options1: " + options + "\noptions2: " + options2;
        Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
    }})

完全自定义布局

通过setLayoutRes方法注入自定义布局,实现特殊交互需求:

pvCustomOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
    @Override
    public void onOptionsSelect(int options1, int option2, int options3, View v) { }
}) 
.setLayoutRes(R.layout.pickerview_custom_options, new CustomListener() {
    @Override
    public void customLayout(View v) { 
        // 自定义视图初始化
        TextView tvSubmit = v.findViewById(R.id.tv_finish);
        ImageView ivCancel = v.findViewById(R.id.iv_cancel);
        tvSubmit.setOnClickListener(...);
    }
})
.build();

自定义布局选择器

自定义布局文件:pickerview_custom_options.xml

实战场景解决方案

场景1:出生日期选择(含农历)

实现公历/农历切换的出生日期选择器:

// 初始化农历选择器
initLunarPicker(); 

// 公农历切换逻辑
CheckBox cb_lunar = v.findViewById(R.id.cb_lunar);
cb_lunar.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        pvCustomLunar.setLunarCalendar(!pvCustomLunar.isLunarCalendar());
    }
});

场景2:三级联动地址选择

通过JSON数据解析实现省市区三级联动:

// 解析JSON数据
ArrayList<JsonBean> jsonBean = parseData(getJson()); 
// 构建三级联动数据
OptionsPickerView pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
    @Override
    public void onOptionsSelect(int options1, int options2, int options3, View v) {
        String address = jsonBean.get(options1).getPickerViewText() + 
                        jsonBean.get(options1).getCityList().get(options2).getPickerViewText() +
                        jsonBean.get(options1).getCityList().get(options2).getAreaList().get(options3).getPickerViewText();
    }
}).build();
pvOptions.setPicker(jsonBean);

JSON解析示例:JsonDataActivity.java

场景3:非联动多维度选择

实现美食、服装、电脑品牌的独立选择:

// 初始化非联动数据
getNoLinkData(); 
// 创建非联动选择器
pvNoLinkOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
    @Override
    public void onOptionsSelect(int options1, int options2, int options3, View v) {
        String str = "food:" + food.get(options1) 
                + "\nclothes:" + clothes.get(options2)
                + "\ncomputer:" + computer.get(options3);
    }
})
.setLinkage(false) // 关键:禁用联动
.build();
pvNoLinkOptions.setNPicker(food, clothes, computer); // 分别设置数据源

注意事项与最佳实践

1. 月份设置陷阱

Calendar类月份从0开始计数,设置日期范围时需特别注意:

// 错误示例:
startDate.set(2013,1,1); // 实际为2013年2月
// 正确示例:
startDate.set(2013,0,1); // 2013年1月
endDate.set(2020,11,31); // 2020年12月

2. 数据加载时机

确保数据加载完成后再初始化选择器,避免空指针异常:

// 正确流程:
getOptionData(); // 先加载数据
initOptionPicker(); // 再初始化选择器

3. 内存管理

在Activity生命周期管理选择器实例:

@Override
protected void onDestroy() {
    super.onDestroy();
    if (pvTime != null) {
        pvTime.dismiss();
        pvTime = null;
    }
}

项目资源与扩展

通过Android-PickerView的统一API和灵活配置,开发者可快速实现各类选择场景,同时保持代码的可维护性和扩展性。无论是简单的时间选择还是复杂的多级联动,该库都能提供一致的交互体验,显著提升开发效率。

【免费下载链接】Android-PickerView 【免费下载链接】Android-PickerView 项目地址: https://gitcode.com/gh_mirrors/and/Android-PickerView

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值