一款好用的PickerView库

2019 年 9 月 22 日

一款好用的PickerView库

本文会通过和目前github上最受欢迎的PickerView库做详细的对比,通过对比你可以清晰的感受它的好用和强大。基本可以解决链家现有app的所有pickerview相关需求。


Screenshot


TimePicker 示意图 :



MixedTimePicker 示意图 :



OptionPicker 示意图:



介 绍


APK


Demo App 下载连接


README


PickerView


README


Picker


通过组装 PickerView 实现常用的 Picker 选择器。下面列举提供的 3 中常用的 Picker。


支持扩展自定义 Picker。


Ø TimePicker:时间选择器,包含日期

Ø MixedTimePicker::聚合的时间选择器

Ø OptionPicker:联动选择器


BasePicker


Picker 基类:封装了 TopBar,PickerView 容器,create and add PickerView 方法,Picker 弹窗等方法。 三种 Picker 都继承自 BasePicker,你也可以继承它扩展自己的 Picker。


设 置 场 景


API



对比 github 上最受欢迎的同类库 Android-PickerView 本库将 TopBar 等通用相关逻辑封装在基类中,并提供代码中创建 PickerView 方法,不需要再依赖 xml。用户自定义 Picker 时,继承 BasePicker,只需要处理自己的逻辑即可,简单便捷。 而对 Android-PickerView 来说,实现自定义 Picker,依然需要处理 TopBar 等逻辑。造成大量重复代码。


TopBar


TopBar:TopBar 通过抽象接口 ITopBar 来管理,实现 Picker 与 TopBar 的解耦。



提供默认实现 DefaultTopBar。可实现接口定制自己的 TopBar。


DefaultTopBar API



Interceptor


拦截器:用于在 pickerview 创建时拦截,设置 pickerview 的属性。


Picker 内部并不提供对 PickerView 的设置方法,而是通过 Interceptor 实现。这种设计用来实现 Picker 和 PickerView 的属性设置完美解耦。



这一点对比 Android-PickerView, 每个 Picker 都需要声明对 PickerView 的设置方法,与 PickerView 严重耦合。需要开发者 copy 大量重复代码,且无法区分每一个 PickerView 设置不同的属性。


TimePicker


常用的时间选择器,支持 年、月、日、时、分



Ø 时间类型type的设计:自由组合、随心所欲(当然应该是有意义的)


对比 Android-PickerView TimePickerView:



Ø 完美支持时间区间设置以及选中联动

Ø 支持Format,如显示今年,明年


API



Formatter


TimePicker Formatter:用于根据 type 和 num 格式化时间文案



内部提供默认的 Formatter 实现 DefaultFormatter。用户可以设置自定义 Formatter 或继承 DefaultFormatter 进行扩展。


TimePicker 初始化,如果未设置时间区间,会使用默认区间。三种 Picker 都采用 Builder 模式初始化。且用户自定义的 Picker 也应该采用这种模式进行初始化。


使 用 案 例


Simple Example




MixedTimePicker


常用的聚合时间选择器。日期(年、月、日)聚合,时间(小时、分钟)聚合。


Ø 混合模式:github上的TimePicker库基本都不提供该种类型的Picker

Ø 支持自定义日期格式,时间格式

Ø 支持设置时间间隔 * 支持设置区间以及选中联动

Ø 支持设置纯日期,纯时间模式,采用type同TimePicker


API



Formatter


MixedTimePicker Formatter:用于自定义日期和时间格式。内部提供默认的 Formatter 实现。



MixedTimePicker 的 Formatter 完美体现了 Formatter 设计的精妙之处。用户可以根据回调中的 type 和 date 自定义日期和时间格式。比如显示今天,或 xx 月 xx 日 星期 x。


使 用 案 例


Simple Example




不同于 TimePicker, MixedTimePicker 由于支持纯时间模式(日期取选中时间的日期),不提供默认区间。如果模式中包含日期模式,则会强制要求设置时间区间。


OptionPicker


Ø 支持设置层级

Ø 构造数据源及其简单,只需要实现OptionDataSet接口

Ø 支持通过对应选中的values设置选中项。内部处理选中项逻辑,避免用户 记录下标且麻烦的遍历处理


对比 Android-PickerView 的 OptionsPickerView



Android-PickerView 中的 OptionsPickerView 代码。由于不知道层级,所以每个方法都提供 3 个用来对应(最多)3 级选择。



本库中的 OptionPicker



如上面对比表格中所列举的,无论是层级,构造数据源和设置数据源,还是设置选中的选项,本库的 API 都十分简单,方便。


API



需要注意的是:本库中的 OptionPicker 只用于联动的,不支持多级别且不联动。 基本没有这种需求,如果大家有这种需求,我会在后续迭代中支持。


延 伸 拓 展


Others


奇葩设计:部分 default 属性声明为 static 而非 final


全局设置 default 属性


奇葩也好,亮点也罢。作为一个 UI 控件,不同的 app,不同的 UI,不同的产品自然会有不同的样式。 考虑到在一个 app 中我们会用到很多 Picker,而我们又需要定制自己的 UI 的样式,如果通过动态方法设置样式就太麻烦了。 故做此设计。你可以通过配置这些 static 变量来快速定制一个满足自己 app 样式需求的 Picker。 当然你也可以通过封装方法来处理 PickerView,Picker,装饰器等样式,但这样一样十分麻烦。我相信你自己都会烦。


静态默认值


所有的这些静态属性值都以 sDefault 开头


• BasePickerView



• PickerView



• BasePicker



• DefaultCenterDecoration



建议初始化这些属性值放到 Application 中完成,避免 app 发生 crash 而导致失效。


Simple Example



Change Log


v1.0.0(2018-03-03)


  • release v1.0.0


Gradle



Thanks


• ScrollPickerView


• Android-PickerView


作者介绍:


付朝阳,新房移动端,15 年 6 月加入链家。先后负责新房用户端、经纪人端 Android app 的开发。


本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。


原文链接:


https://mp.weixin.qq.com/s/fSrWF4PFZkvky7rkeCf46w


2019 年 9 月 22 日 22:29405

评论

发布
暂无评论
发现更多内容

架构师训练营第一期——第三周作业

tao

链表转换为二叉排序树、反应式编程 RxSwift和RxCocoa 、区块链hyperledger环境搭建、环境架构、John 易筋 ARTS 打卡 Week 20

John(易筋)

响应式编程 ARTS 打卡计划 hyperledger 链表转为二叉排序树 chmod

第三周作业 (作业二)

Geek_83908e

极客大学架构师训练营

架构师训练营 week3 总结

陈皓07

架构师训练营Week03作业

IT老兵重开始

极客大学架构师训练营

架构师训练营第 1 期第三周课后练习题

郑凯元

极客大学架构师训练营

第三周 学习总结

mm马

极客大学架构师训练营

第3周

paul

极客大学-第三周作业

Black Eyed Peter

极客大学架构师训练营

第三周 代码重构 学习总结

应鹏

极客大学架构师训练营

第三周总结

积极&丧

极客大学架构师训练营

第三周 代码重构 学习笔记

应鹏

学习 极客大学架构师训练营

第三周

等燕归

第三周作业

熊桂平

极客大学架构师训练营

第三周作业

Kenny

架构师训练营第 1 期第三周学习总结

郑凯元

极客大学架构师训练营

Week_03 作业

golangboy

架构师训练营 - 第三周作业

咖啡

第三周课后练习 - 作业 1

致星海

第三周作业(作业一)

Geek_83908e

极客大学架构师训练营

Week 3 作业 02

Croesus

Week 3 學習總結 - Design patterns

--------世界中心---------

架構師 設計模式 Design Patterns

架构训练营 - 第3周课后作业 - 学习总结

Pudding

【架构师训练营第 1 期 03 周】 学习总结

Bear在挨踢

极客大学架构师训练营

架构师训练营 - 第 3 周课后作业(1 期)

Pudding

架构师训练营第 1 期 02 周 作业

Geek_a01290

极客大学架构师训练营

Week 3 作業一 : Design Patterns

--------世界中心---------

Java 架構師 設計模式 Design Patterns

第3周作业

TheSRE

架构师训练营第 1 期 02 周 总结

Geek_a01290

极客大学架构师训练营

代码重构

ABS

第二周作业

Kenny

一款好用的PickerView库-InfoQ