Android-PickerView 使用教程:打造仿iOS风格的选择器
Android-PickerView 是一款专为 Android 开发者设计的开源库,能够实现类似 iOS 中的 Picker View 功能。它提供了时间选择器和选项选择器两种主要功能,支持联动效果和自定义布局,是开发中常用的选择器解决方案。
项目介绍
Android-PickerView 具有以下核心特性:
- 时间选择器:支持年月日时分、年月日、年月、时分等多种格式
- 选项选择器:支持一级、二级、三级选项选择,可设置是否联动
- 自定义布局:完全支持自定义界面样式
- 丰富配置:支持循环模式、分隔线设置、Item间距、起始终止日期设定等
- 国际化支持:支持多语言标签显示
快速开始
添加依赖
由于项目已停止更新,建议直接下载源码引入到自己的项目中:
git clone https://gitcode.com/gh_mirrors/an/Android-PickerView
然后将 pickerview 和 wheelview 模块导入到你的 Android Studio 项目中。
基本使用示例
时间选择器
// 初始化时间选择器
TimePickerView pvTime = new TimePickerBuilder(MainActivity.this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
// 选中时间后的回调
Toast.makeText(MainActivity.this, getTime(date), Toast.LENGTH_SHORT).show();
}
}).build();
// 显示时间选择器
pvTime.show();
选项选择器
// 初始化选项选择器
OptionsPickerView pvOptions = new OptionsPickerBuilder(MainActivity.this, new OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3, View v) {
// 返回三个级别的选中位置
String selectedText = options1Items.get(options1).getPickerViewText()
+ options2Items.get(options1).get(option2);
textView.setText(selectedText);
}
}).build();
// 设置数据源并显示
pvOptions.setPicker(options1Items, options2Items);
pvOptions.show();
自定义配置
时间选择器自定义
Calendar selectedDate = Calendar.getInstance();
Calendar startDate = Calendar.getInstance();
startDate.set(2013, 0, 1); // 注意:月份从0开始
Calendar endDate = Calendar.getInstance();
endDate.set(2020, 11, 31);
TimePickerView pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
// 选中事件处理
}
})
.setType(new boolean[]{true, true, true, true, true, true})
.setCancelText("取消")
.setSubmitText("确定")
.setTitleText("选择时间")
.setTitleColor(Color.BLACK)
.setSubmitColor(Color.BLUE)
.setCancelColor(Color.BLUE)
.setDate(selectedDate)
.setRangDate(startDate, endDate)
.setLabel("年", "月", "日", "时", "分", "秒")
.isCenterLabel(false)
.build();
选项选择器自定义
OptionsPickerView pvOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int option2, int options3, View v) {
// 选项选中处理
}
})
.setTitleText("城市选择")
.setSubmitText("确定")
.setCancelText("取消")
.setTitleSize(20)
.setContentTextSize(18)
.setTitleColor(Color.BLACK)
.setSubmitColor(Color.BLUE)
.setCancelColor(Color.BLUE)
.setLinkage(true) // 设置是否联动
.setLabels("省", "市", "区")
.setCyclic(false, false, false)
.setSelectOptions(0, 0, 0)
.build();
自定义布局
Android-PickerView 支持完全自定义布局,只需要在布局文件中包含 optionspicker 或 timepicker 的 ID:
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(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomOptions.returnData();
pvCustomOptions.dismiss();
}
});
ivCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pvCustomOptions.dismiss();
}
});
}
})
.build();
数据准备
普通数据源
// 一级数据
ArrayList<String> options1Items = new ArrayList<>();
options1Items.add("选项1");
options1Items.add("选项2");
options1Items.add("选项3");
// 二级联动数据
ArrayList<ArrayList<String>> options2Items = new ArrayList<>();
ArrayList<String> options2Items_01 = new ArrayList<>();
options2Items_01.add("选项1-1");
options2Items_01.add("选项1-2");
options2Items.add(options2Items_01);
Bean 对象数据源
如果使用 JavaBean 作为数据源,需要实现 IPickerViewData 接口:
public class ProvinceBean implements IPickerViewData {
private long id;
private String name;
public ProvinceBean(long id, String name) {
this.id = id;
this.name = name;
}
@Override
public String getPickerViewText() {
return this.name;
}
// getter 和 setter 方法
}
注意事项
- 月份设置:Calendar 组件内部的月份是从 0 开始的,即 0-11 代表 1-12 月份
- 自定义布局:必须包含
optionspicker或timepicker的布局 ID - 数据加载:确保数据加载完成后再显示选择器,避免空指针异常
- 内存管理:在适当的生命周期方法中释放资源
高级功能
农历支持
Android-PickerView 支持农历时间选择,时间范围从 1900 年到 2100 年:
pvCustomLunar = new TimePickerBuilder(this, new OnTimeSelectListener() {
@Override
public void onTimeSelect(Date date, View v) {
// 农历时间选择回调
}
})
.setLayoutRes(R.layout.pickerview_custom_lunar, new CustomListener() {
@Override
public void customLayout(View v) {
// 农历布局初始化
CheckBox cbLunar = v.findViewById(R.id.cb_lunar);
cbLunar.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
pvCustomLunar.setLunarCalendar(isChecked);
}
});
}
})
.build();
非联动多级选择
// 准备非联动数据
ArrayList<String> food = new ArrayList<>();
food.add("KFC");
food.add("MacDonald");
ArrayList<String> clothes = new ArrayList<>();
clothes.add("Nike");
clothes.add("Adidas");
// 初始化非联动选择器
pvNoLinkOptions = new OptionsPickerBuilder(this, new OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int options2, int options3, View v) {
String result = "食物:" + food.get(options1) + "\n衣服:" + clothes.get(options2);
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
}
})
.build();
pvNoLinkOptions.setNPicker(food, clothes, null);
最佳实践
- 统一样式:在整个应用中保持选择器样式的一致性
- 性能优化:对于大量数据,考虑使用分页加载或异步加载
- 错误处理:添加适当的空数据检查和异常处理
- 用户体验:根据使用场景选择合适的动画效果和交互方式
Android-PickerView 提供了强大而灵活的选择器功能,通过合理的配置和自定义,可以满足各种业务场景的需求。无论是简单的单项选择还是复杂的多级联动,都能轻松实现。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






