告别选择器碎片化: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;
}
}
项目资源与扩展
-
官方文档:README.md
-
Demo示例:MainActivity.java
-
自定义布局模板:
-
仓库地址:https://gitcode.com/gh_mirrors/and/Android-PickerView
通过Android-PickerView的统一API和灵活配置,开发者可快速实现各类选择场景,同时保持代码的可维护性和扩展性。无论是简单的时间选择还是复杂的多级联动,该库都能提供一致的交互体验,显著提升开发效率。
【免费下载链接】Android-PickerView 项目地址: https://gitcode.com/gh_mirrors/and/Android-PickerView
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考







