Browse Source

增加学生端约课页面,以及pickerView本地库,修改项目的选择时间和选择选项弹窗样式

Pq 3 months ago
parent
commit
7d4d54f205
100 changed files with 6088 additions and 327 deletions
  1. 2 1
      BaseLibrary/build.gradle
  2. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt
  3. 4 1
      BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/set/EditAddressActivity.java
  4. 33 11
      BaseLibrary/src/main/res/layout/pickerview_address_layout.xml
  5. 34 11
      BaseLibrary/src/main/res/layout/pickerview_default_layout.xml
  6. 34 12
      BaseLibrary/src/main/res/layout/pickerview_options_default_layout.xml
  7. 4 0
      institution/src/main/java/com/cooleshow/institution/stu/ui/setting/PersonalSettingActivity.java
  8. 34 11
      institution/src/main/res/layout/jg_pickerview_default_layout.xml
  9. 1 0
      pickerview/.gitignore
  10. 48 0
      pickerview/build.gradle
  11. 17 0
      pickerview/proguard-rules.pro
  12. 13 0
      pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java
  13. 5 0
      pickerview/src/main/AndroidManifest.xml
  14. 48 0
      pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java
  15. 54 0
      pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java
  16. 304 0
      pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java
  17. 327 0
      pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java
  18. 117 0
      pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java
  19. 13 0
      pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java
  20. 15 0
      pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener2.java
  21. 10 0
      pickerview/src/main/java/com/bigkoo/pickerview/listener/ISelectTimeCallback.java
  22. 10 0
      pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java
  23. 11 0
      pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectChangeListener.java
  24. 13 0
      pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectListener.java
  25. 12 0
      pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectChangeListener.java
  26. 14 0
      pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectListener.java
  27. 352 0
      pickerview/src/main/java/com/bigkoo/pickerview/utils/ChinaDate.java
  28. 429 0
      pickerview/src/main/java/com/bigkoo/pickerview/utils/LunarCalendar.java
  29. 26 0
      pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java
  30. 373 0
      pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java
  31. 204 0
      pickerview/src/main/java/com/bigkoo/pickerview/view/OptionsPickerView.java
  32. 290 0
      pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java
  33. 440 0
      pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java
  34. 915 0
      pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java
  35. 19 0
      pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml
  36. 18 0
      pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml
  37. 11 0
      pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml
  38. 11 0
      pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml
  39. 6 0
      pickerview/src/main/res/drawable/selector_pickerview_btn.xml
  40. 43 0
      pickerview/src/main/res/layout/include_pickerview_topbar.xml
  41. 16 0
      pickerview/src/main/res/layout/layout_basepickerview.xml
  42. 41 0
      pickerview/src/main/res/layout/pickerview_options.xml
  43. 59 0
      pickerview/src/main/res/layout/pickerview_time.xml
  44. 11 0
      pickerview/src/main/res/values-en/strings.xml
  45. 13 0
      pickerview/src/main/res/values/dimens.xml
  46. 5 0
      pickerview/src/main/res/values/integers.xml
  47. 11 0
      pickerview/src/main/res/values/strings.xml
  48. 31 0
      pickerview/src/main/res/values/styles.xml
  49. 2 0
      settings.gradle
  50. 6 0
      student/src/main/AndroidManifest.xml
  51. 8 0
      student/src/main/java/com/cooleshow/student/bean/QuerySubjectBean.java
  52. 17 0
      student/src/main/java/com/cooleshow/student/contract/InterestCorrectionCourseListContract.java
  53. 17 0
      student/src/main/java/com/cooleshow/student/contract/LiveCourseAppointListContract.java
  54. 18 0
      student/src/main/java/com/cooleshow/student/contract/VIPCustomCourseListContract.java
  55. 17 0
      student/src/main/java/com/cooleshow/student/contract/VideoCourseAppointListContract.java
  56. 56 0
      student/src/main/java/com/cooleshow/student/presenter/course/InterestCorrectionCourseListPresenter.java
  57. 55 0
      student/src/main/java/com/cooleshow/student/presenter/course/LiveCourseAppointListPresenter.java
  58. 55 0
      student/src/main/java/com/cooleshow/student/presenter/course/VIPCustomCourseListPresenter.java
  59. 55 0
      student/src/main/java/com/cooleshow/student/presenter/course/VideoCourseAppointListPresenter.java
  60. 147 0
      student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java
  61. 55 0
      student/src/main/java/com/cooleshow/student/ui/course/InterestCorrectionCourseListFragment.java
  62. 54 0
      student/src/main/java/com/cooleshow/student/ui/course/LiveCourseAppointListFragment.java
  63. 14 4
      student/src/main/java/com/cooleshow/student/ui/course/LiveCourseFragment.java
  64. 14 4
      student/src/main/java/com/cooleshow/student/ui/course/MinePracticeCourseFragment.java
  65. 9 1
      student/src/main/java/com/cooleshow/student/ui/course/PianoRoomCourseFragment.java
  66. 123 0
      student/src/main/java/com/cooleshow/student/ui/course/VIPCustomCourseListFragment.java
  67. 53 0
      student/src/main/java/com/cooleshow/student/ui/course/VideoCourseAppointListFragment.java
  68. 5 2
      student/src/main/java/com/cooleshow/student/ui/course/VideoCourseFragment.java
  69. 2 0
      student/src/main/java/com/cooleshow/student/ui/main/MusicHallFragment.java
  70. 4 0
      student/src/main/java/com/cooleshow/student/ui/mine/PersonalSettingActivity.java
  71. 4 0
      student/src/main/java/com/cooleshow/student/ui/work/HomeWorkFragment.java
  72. 38 0
      student/src/main/res/layout/activity_appointment_course.xml
  73. 146 0
      student/src/main/res/layout/fg_interest_correction_course_list_layout.xml
  74. 146 0
      student/src/main/res/layout/fg_live_course_appoint_list_layout.xml
  75. 146 0
      student/src/main/res/layout/fg_video_course_appoint_list_layout.xml
  76. 146 0
      student/src/main/res/layout/fg_vip_custom_course_list_layout.xml
  77. 0 76
      student/src/main/res/layout/pickerview_address_layout.xml
  78. 4 0
      teacher/src/main/java/com/cooleshow/teacher/ui/comment/CourseCommentHasReplyFragment.java
  79. 4 0
      teacher/src/main/java/com/cooleshow/teacher/ui/comment/CourseCommentNoReplyFragment.java
  80. 4 0
      teacher/src/main/java/com/cooleshow/teacher/ui/comment/ReceivedCommentActivity.java
  81. 9 1
      teacher/src/main/java/com/cooleshow/teacher/ui/course/LiveCourseFragment.java
  82. 9 1
      teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoRoomCourseFragment.java
  83. 9 1
      teacher/src/main/java/com/cooleshow/teacher/ui/course/SparringCourseFragment.java
  84. 10 3
      teacher/src/main/java/com/cooleshow/teacher/ui/homepage/SheetMusicPageFragment.java
  85. 4 0
      teacher/src/main/java/com/cooleshow/teacher/ui/homepage/SparringCoursePageFragment.java
  86. 5 0
      teacher/src/main/java/com/cooleshow/teacher/ui/income/EarningStatisticsActivity.java
  87. 4 0
      teacher/src/main/java/com/cooleshow/teacher/ui/income/FrozenAmountActivity.java
  88. 7 1
      teacher/src/main/java/com/cooleshow/teacher/ui/income/MineIncomeActivity.java
  89. 7 1
      teacher/src/main/java/com/cooleshow/teacher/ui/income/PendingAmountActivity.java
  90. 3 0
      teacher/src/main/java/com/cooleshow/teacher/ui/income/WithdrawalRecordActivity.java
  91. 5 1
      teacher/src/main/java/com/cooleshow/teacher/ui/live/CreateLiveActivity.java
  92. 6 2
      teacher/src/main/java/com/cooleshow/teacher/ui/mine/BindBankCardActivity.java
  93. 4 0
      teacher/src/main/java/com/cooleshow/teacher/ui/work/HomeWorkFragment.java
  94. 0 76
      teacher/src/main/res/layout/pickerview_address_layout.xml
  95. 33 11
      teacher/src/main/res/layout/pickerview_bank_layout.xml
  96. 33 12
      teacher/src/main/res/layout/pickerview_live_time_layout.xml
  97. 6 2
      usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/BindPasswordActivity.java
  98. 4 2
      usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/setting/FeedBackActivity.java
  99. 4 3
      usercenter/src/main/java/com/cooleshow/usercenter/widget/FeedBackRecordFilterView.java
  100. 0 76
      usercenter/src/main/res/layout/pickerview_sex_select_layout.xml

+ 2 - 1
BaseLibrary/build.gradle

@@ -142,7 +142,8 @@ dependencies {
     api "com.haibin:calendarview:3.7.1"
 
     api 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7'
-    api 'com.contrarywind:Android-PickerView:4.1.9'
+//    api 'com.contrarywind:Android-PickerView:4.1.9'
+    api project(path: ':pickerview')
 
     api 'io.github.scwang90:refresh-layout-kernel:2.0.5'      //核心必须依赖
     api 'io.github.scwang90:refresh-header-classics:2.0.5'    //经典刷新头

+ 1 - 0
BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt

@@ -85,6 +85,7 @@ object RouterPath {
     class CourseCenter {
         companion object {
             const val TEACHER_MINE_COURSE = "/teacher/ui/course/MineCourseActivity"
+            const val APPOINTMENT_COURSE = "/teacher/ui/course/AppointmentCourseActivity"
             const val SPARRING_COURSE_DETAIL = "/teacher/ui/course/SparringCourseDetailActivity"
             const val PIANO_ROOM_COURSE_DETAIL = "/ui/course/PianoRoomCourseDetailActivity"
             const val PIANO_ROOM_COURSE_HOMEWORK = "/ui/course/PianoRoomCourseHomeWorkActivity"

+ 4 - 1
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/set/EditAddressActivity.java

@@ -1,6 +1,7 @@
 package com.cooleshow.base.ui.activity.set;
 
 import android.annotation.SuppressLint;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Message;
@@ -220,7 +221,9 @@ public class EditAddressActivity extends BaseMVPActivity<ActivityEditAddressBind
                     });
                     ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-                })
+                }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT)
                 .isDialog(false)//是否显示为对话框样式
                 .build();
         pvOptions.setPicker(options1Items, options2Items, options3Items);//三级选择器

+ 33 - 11
BaseLibrary/src/main/res/layout/pickerview_address_layout.xml

@@ -1,23 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:background="@drawable/bg_white_top_10dp"
     android:orientation="vertical">
 
     <RelativeLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:id="@+id/rl_top"
         android:layout_width="match_parent"
-        android:layout_height="50dp">
+        android:layout_height="wrap_content">
 
 
         <TextView
+            android:padding="14dp"
             android:id="@+id/tv_cancel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
+            android:layout_marginLeft="6dp"
             android:text="取消"
-            android:textColor="@color/color_999999"
+            android:textColor="@color/color_666666"
             android:textSize="@dimen/dp_16" />
 
         <TextView
@@ -34,21 +39,38 @@
             android:layout_height="wrap_content"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
+            android:layout_marginRight="6dp"
+            android:padding="14dp"
             android:text="确定"
-            android:textColor="@color/colorPrimary"
+            android:textColor="@color/color_2dc7aa"
             android:textSize="@dimen/dp_16" />
 
     </RelativeLayout>
 
-    <View style="@style/line_style" />
+    <View
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintBottom_toBottomOf="@+id/optionspicker"
+        app:layout_constraintTop_toTopOf="@+id/optionspicker"
+        android:background="@drawable/shape_f2f2f2_6dp"
+        android:layout_width="match_parent"
+        android:layout_height="44dp"/>
+
+    <View
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/rl_top"
+        android:id="@+id/view_line"
+        style="@style/line_style"
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"/>
     <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
     <LinearLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_line"
         android:id="@+id/optionspicker"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="#ffffff"
+        android:layout_height="@dimen/dp_250"
         android:gravity="center"
         android:minHeight="150dp"
         android:orientation="horizontal">
@@ -73,4 +95,4 @@
     </LinearLayout>
 
 
-</LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 34 - 11
BaseLibrary/src/main/res/layout/pickerview_default_layout.xml

@@ -1,23 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:background="@drawable/bg_white_top_10dp"
     android:orientation="vertical">
 
     <RelativeLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:id="@+id/rl_top"
         android:layout_width="match_parent"
-        android:layout_height="50dp">
+        android:layout_height="wrap_content">
 
 
         <TextView
+            android:padding="14dp"
             android:id="@+id/tv_cancel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
+            android:layout_marginLeft="6dp"
             android:text="取消"
-            android:textColor="@color/color_999999"
+            android:textColor="@color/color_666666"
             android:textSize="@dimen/dp_16" />
 
         <TextView
@@ -34,21 +39,39 @@
             android:layout_height="wrap_content"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
+            android:layout_marginRight="6dp"
+            android:padding="14dp"
             android:text="确定"
             android:textColor="@color/colorPrimary"
             android:textSize="@dimen/dp_16" />
 
     </RelativeLayout>
 
-    <View style="@style/line_style" />
+    <View
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintBottom_toBottomOf="@+id/timepicker"
+        app:layout_constraintTop_toTopOf="@+id/timepicker"
+        android:background="@drawable/shape_f2f2f2_6dp"
+        android:layout_width="match_parent"
+        android:layout_height="44dp"/>
+
+    <View
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/rl_top"
+        android:id="@+id/view_line"
+        style="@style/line_style"
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"/>
     <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
     <LinearLayout
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_line"
         android:id="@+id/timepicker"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="@android:color/white"
+        android:layout_width="0dp"
+        android:layout_height="@dimen/dp_250"
         android:gravity="center"
         android:minHeight="150dp"
         android:orientation="horizontal">
@@ -92,4 +115,4 @@
     </LinearLayout>
 
 
-</LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 34 - 12
BaseLibrary/src/main/res/layout/pickerview_options_default_layout.xml

@@ -1,23 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:background="@drawable/bg_white_top_10dp"
     android:orientation="vertical">
 
     <RelativeLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:id="@+id/rl_top"
         android:layout_width="match_parent"
-        android:layout_height="50dp">
+        android:layout_height="wrap_content">
 
 
         <TextView
+            android:padding="14dp"
             android:id="@+id/tv_cancel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
+            android:layout_marginLeft="6dp"
             android:text="取消"
-            android:textColor="@color/color_999999"
+            android:textColor="@color/color_666666"
             android:textSize="@dimen/dp_16" />
 
         <TextView
@@ -25,7 +30,7 @@
             android:layout_height="wrap_content"
             android:layout_centerInParent="true"
             android:text=""
-            android:textColor="@color/color_333333"
+            android:textColor="@color/color_1a1a1a"
             android:textSize="18dp" />
 
         <TextView
@@ -34,21 +39,38 @@
             android:layout_height="wrap_content"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
+            android:layout_marginRight="6dp"
+            android:padding="14dp"
             android:text="确定"
-            android:textColor="@color/colorPrimary"
+            android:textColor="@color/color_2dc7aa"
             android:textSize="@dimen/dp_16" />
 
     </RelativeLayout>
 
-    <View style="@style/line_style" />
+    <View
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintBottom_toBottomOf="@+id/optionspicker"
+        app:layout_constraintTop_toTopOf="@+id/optionspicker"
+        android:background="@drawable/shape_f2f2f2_6dp"
+        android:layout_width="match_parent"
+        android:layout_height="44dp"/>
+
+    <View
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/rl_top"
+        android:id="@+id/view_line"
+        style="@style/line_style"
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"/>
     <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
     <LinearLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_line"
         android:id="@+id/optionspicker"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="@android:color/white"
+        android:layout_height="@dimen/dp_250"
         android:gravity="center"
         android:minHeight="150dp"
         android:orientation="horizontal">
@@ -73,4 +95,4 @@
     </LinearLayout>
 
 
-</LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 4 - 0
institution/src/main/java/com/cooleshow/institution/stu/ui/setting/PersonalSettingActivity.java

@@ -2,6 +2,7 @@ package com.cooleshow.institution.stu.ui.setting;
 
 import android.Manifest;
 import android.content.Intent;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Build;
@@ -199,6 +200,9 @@ public class PersonalSettingActivity extends BaseMVPActivity<JgActivityPersonalS
 
                     }
                 })
+                .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT)
                 .setLineSpacingMultiplier(2.5f)
                 .setType(new boolean[]{true, true, true, false, false, false})// 默认全部显示
                 .isCyclic(true)//是否循环滚动

+ 34 - 11
institution/src/main/res/layout/jg_pickerview_default_layout.xml

@@ -1,23 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:background="@drawable/bg_white_top_10dp"
     android:orientation="vertical">
 
     <RelativeLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:id="@+id/rl_top"
         android:layout_width="match_parent"
-        android:layout_height="50dp">
+        android:layout_height="wrap_content">
 
 
         <TextView
+            android:padding="14dp"
             android:id="@+id/tv_cancel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
+            android:layout_marginLeft="6dp"
             android:text="取消"
-            android:textColor="@color/color_999999"
+            android:textColor="@color/color_666666"
             android:textSize="@dimen/dp_16" />
 
         <TextView
@@ -34,21 +39,39 @@
             android:layout_height="wrap_content"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
+            android:layout_marginRight="6dp"
+            android:padding="14dp"
             android:text="确定"
             android:textColor="@color/color_fe2451"
             android:textSize="@dimen/dp_16" />
 
     </RelativeLayout>
 
-    <View style="@style/line_style" />
+    <View
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintBottom_toBottomOf="@+id/timepicker"
+        app:layout_constraintTop_toTopOf="@+id/timepicker"
+        android:background="@drawable/shape_f2f2f2_6dp"
+        android:layout_width="match_parent"
+        android:layout_height="44dp"/>
+
+    <View
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/rl_top"
+        android:id="@+id/view_line"
+        style="@style/line_style"
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"/>
     <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
     <LinearLayout
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_line"
         android:id="@+id/timepicker"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="@android:color/white"
+        android:layout_width="0dp"
+        android:layout_height="@dimen/dp_250"
         android:gravity="center"
         android:minHeight="150dp"
         android:orientation="horizontal">
@@ -92,4 +115,4 @@
     </LinearLayout>
 
 
-</LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 0
pickerview/.gitignore

@@ -0,0 +1 @@
+/build

+ 48 - 0
pickerview/build.gradle

@@ -0,0 +1,48 @@
+apply plugin: 'com.android.library'
+//apply plugin: 'com.github.dcendents.android-maven'
+//apply plugin: 'com.novoda.bintray-release'//添加JCenter插件
+
+
+
+android {
+    compileSdkVersion 26
+
+    defaultConfig {
+        minSdkVersion 14
+        targetSdkVersion 26
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+    lintOptions {
+        abortOnError false
+    }
+}
+
+//allprojects {
+//    tasks.withType(Javadoc) {//兼容中文字符
+//        options{
+//            encoding "UTF-8"
+//            charSet 'UTF-8'
+//            links "http://docs.oracle.com/javase/7/docs/api"
+//        }
+//    }
+//}
+//publish {
+//    userOrg = 'contrarywind'//bintray.com 用户名/组织名 user/org name
+//    groupId = 'com.contrarywind'//JCenter上显示的路径 path
+//    artifactId = 'Android-PickerView'//项目名称 project name
+//    publishVersion = '4.1.9'//版本号 version code
+//    desc = 'this is a pickerview for android'//项目描述 description
+//    website = 'https://github.com/Bigkoo/Android-PickerView' //项目网址链接 link
+//}
+
+dependencies {
+//    compile fileTree(include: ['*.jar'], dir: 'libs')
+    api project(path: ':wheelview')
+//    api 'com.contrarywind:wheelview:4.1.0'
+    implementation 'com.android.support:support-annotations:28.0.0'
+}

+ 17 - 0
pickerview/proguard-rules.pro

@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /Users/Sai/Documents/software/sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}

+ 13 - 0
pickerview/src/androidTest/java/com/bigkoo/pickerview/ApplicationTest.java

@@ -0,0 +1,13 @@
+package com.bigkoo.pickerview;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+    public ApplicationTest() {
+        super(Application.class);
+    }
+}

+ 5 - 0
pickerview/src/main/AndroidManifest.xml

@@ -0,0 +1,5 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.bigkoo.pickerview">
+
+
+</manifest>

+ 48 - 0
pickerview/src/main/java/com/bigkoo/pickerview/adapter/ArrayWheelAdapter.java

@@ -0,0 +1,48 @@
+package com.bigkoo.pickerview.adapter;
+
+import com.contrarywind.adapter.WheelAdapter;
+
+import java.util.List;
+
+/**
+ * The simple Array wheel adapter
+ * @param <T> the element type
+ */
+public class ArrayWheelAdapter<T> implements WheelAdapter {
+	
+
+	// items
+	private List<T> items;
+
+	/**
+	 * Constructor
+	 * @param items the items
+	 */
+	public ArrayWheelAdapter(List<T> items) {
+		this.items = items;
+
+	}
+
+	public List<T> getItems() {
+		return items;
+	}
+
+	@Override
+	public Object getItem(int index) {
+		if (index >= 0 && index < items.size()) {
+			return items.get(index);
+		}
+		return "";
+	}
+
+	@Override
+	public int getItemsCount() {
+		return items.size();
+	}
+
+	@Override
+	public int indexOf(Object o){
+		return items.indexOf(o);
+	}
+
+}

+ 54 - 0
pickerview/src/main/java/com/bigkoo/pickerview/adapter/NumericWheelAdapter.java

@@ -0,0 +1,54 @@
+package com.bigkoo.pickerview.adapter;
+
+
+import com.contrarywind.adapter.WheelAdapter;
+
+import java.util.List;
+
+/**
+ * Numeric Wheel adapter.
+ */
+public class NumericWheelAdapter implements WheelAdapter {
+	
+	private int minValue;
+	private int maxValue;
+
+	/**
+	 * Constructor
+	 * @param minValue the wheel min value
+	 * @param maxValue the wheel max value
+	 */
+	public NumericWheelAdapter(int minValue, int maxValue) {
+		this.minValue = minValue;
+		this.maxValue = maxValue;
+	}
+
+	@Override
+	public Object getItem(int index) {
+		if (index >= 0 && index < getItemsCount()) {
+			int value = minValue + index;
+			return value;
+		}
+		return 0;
+	}
+
+	@Override
+	public List getItems() {
+		return null;
+	}
+
+	@Override
+	public int getItemsCount() {
+		return maxValue - minValue + 1;
+	}
+	
+	@Override
+	public int indexOf(Object o){
+		try {
+			return (int)o - minValue;
+		} catch (Exception e) {
+			return -1;
+		}
+
+	}
+}

+ 304 - 0
pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java

@@ -0,0 +1,304 @@
+package com.bigkoo.pickerview.builder;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.bigkoo.pickerview.configure.PickerOptions;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.CustomListener2;
+import com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
+import com.contrarywind.view.WheelView;
+
+import androidx.annotation.ColorInt;
+
+/**
+ * Created by xiaosongzeem on 2018/3/20.
+ */
+
+public class OptionsPickerBuilder {
+
+    //配置类
+    private PickerOptions mPickerOptions;
+
+
+    //Required
+    public OptionsPickerBuilder(Context context, OnOptionsSelectListener listener) {
+        mPickerOptions = new PickerOptions(PickerOptions.TYPE_PICKER_OPTIONS);
+        mPickerOptions.context = context;
+        mPickerOptions.optionsSelectListener = listener;
+    }
+
+    //Option
+    public OptionsPickerBuilder setSubmitText(String textContentConfirm) {
+        mPickerOptions.textContentConfirm = textContentConfirm;
+        return this;
+    }
+
+    public OptionsPickerBuilder setCancelText(String textContentCancel) {
+        mPickerOptions.textContentCancel = textContentCancel;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTitleText(String textContentTitle) {
+        mPickerOptions.textContentTitle = textContentTitle;
+        return this;
+    }
+
+    public OptionsPickerBuilder isDialog(boolean isDialog) {
+        mPickerOptions.isDialog = isDialog;
+        return this;
+    }
+
+    public OptionsPickerBuilder addOnCancelClickListener(View.OnClickListener cancelListener) {
+        mPickerOptions.cancelListener = cancelListener;
+        return this;
+    }
+
+
+    public OptionsPickerBuilder setSubmitColor(int textColorConfirm) {
+        mPickerOptions.textColorConfirm = textColorConfirm;
+        return this;
+    }
+
+    public OptionsPickerBuilder setCancelColor(int textColorCancel) {
+        mPickerOptions.textColorCancel = textColorCancel;
+        return this;
+    }
+
+
+    /**
+     * {@link #setOutSideColor} instead.
+     *
+     * @param backgroundId color resId.
+     */
+    @Deprecated
+    public OptionsPickerBuilder setBackgroundId(int backgroundId) {
+        mPickerOptions.outSideColor = backgroundId;
+        return this;
+    }
+
+    /**
+     * 显示时的外部背景色颜色,默认是灰色
+     *
+     * @param outSideColor color resId.
+     * @return
+     */
+    public OptionsPickerBuilder setOutSideColor(int outSideColor) {
+        mPickerOptions.outSideColor = outSideColor;
+        return this;
+    }
+
+    /**
+     * ViewGroup 类型
+     * 设置PickerView的显示容器
+     *
+     * @param decorView Parent View.
+     * @return
+     */
+    public OptionsPickerBuilder setDecorView(ViewGroup decorView) {
+        mPickerOptions.decorView = decorView;
+        return this;
+    }
+
+    public OptionsPickerBuilder setLayoutRes(int res, CustomListener listener) {
+        mPickerOptions.layoutRes = res;
+        mPickerOptions.customListener = listener;
+        return this;
+    }
+
+    public OptionsPickerBuilder setLayoutRes(int res, CustomListener2 listener) {
+        mPickerOptions.layoutRes = res;
+        mPickerOptions.customListener2 = listener;
+        return this;
+    }
+
+    public OptionsPickerBuilder setBgColor(int bgColorWheel) {
+        mPickerOptions.bgColorWheel = bgColorWheel;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTitleBgColor(int bgColorTitle) {
+        mPickerOptions.bgColorTitle = bgColorTitle;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTitleColor(int textColorTitle) {
+        mPickerOptions.textColorTitle = textColorTitle;
+        return this;
+    }
+
+    public OptionsPickerBuilder setSubCalSize(int textSizeSubmitCancel) {
+        mPickerOptions.textSizeSubmitCancel = textSizeSubmitCancel;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTitleSize(int textSizeTitle) {
+        mPickerOptions.textSizeTitle = textSizeTitle;
+        return this;
+    }
+
+    public OptionsPickerBuilder setContentTextSize(int textSizeContent) {
+        mPickerOptions.textSizeContent = textSizeContent;
+        return this;
+    }
+
+    public OptionsPickerBuilder setOutSideCancelable(boolean cancelable) {
+        mPickerOptions.cancelable = cancelable;
+        return this;
+    }
+
+
+    public OptionsPickerBuilder setLabels(String label1, String label2, String label3) {
+        mPickerOptions.label1 = label1;
+        mPickerOptions.label2 = label2;
+        mPickerOptions.label3 = label3;
+        return this;
+    }
+
+    /**
+     * 设置Item 的间距倍数,用于控制 Item 高度间隔
+     *
+     * @param lineSpacingMultiplier 浮点型,1.0-4.0f 之间有效,超过则取极值。
+     */
+    public OptionsPickerBuilder setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        mPickerOptions.lineSpacingMultiplier = lineSpacingMultiplier;
+        return this;
+    }
+
+    /**
+     * Set item divider line type color.
+     *
+     * @param dividerColor color resId.
+     */
+    public OptionsPickerBuilder setDividerColor(@ColorInt int dividerColor) {
+        mPickerOptions.dividerColor = dividerColor;
+        return this;
+    }
+
+    public OptionsPickerBuilder setDividerPadding(int dividerPadding) {
+        mPickerOptions.dividerPadding = dividerPadding;
+        return this;
+    }
+
+    /**
+     * Set item divider line type.
+     *
+     * @param dividerType enum Type {@link WheelView.DividerType}
+     */
+    public OptionsPickerBuilder setDividerType(WheelView.DividerType dividerType) {
+        mPickerOptions.dividerType = dividerType;
+        return this;
+    }
+
+    /**
+     * Set the textColor of selected item.
+     *
+     * @param textColorCenter color res.
+     */
+    public OptionsPickerBuilder setTextColorCenter(int textColorCenter) {
+        mPickerOptions.textColorCenter = textColorCenter;
+        return this;
+    }
+
+    /**
+     * Set the textColor of outside item.
+     *
+     * @param textColorOut color resId.
+     */
+    public OptionsPickerBuilder setTextColorOut(@ColorInt int textColorOut) {
+        mPickerOptions.textColorOut = textColorOut;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTypeface(Typeface font) {
+        mPickerOptions.font = font;
+        return this;
+    }
+
+    public OptionsPickerBuilder setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {
+        mPickerOptions.cyclic1 = cyclic1;
+        mPickerOptions.cyclic2 = cyclic2;
+        mPickerOptions.cyclic3 = cyclic3;
+        return this;
+    }
+
+    public OptionsPickerBuilder setSelectOptions(int option1) {
+        mPickerOptions.option1 = option1;
+        return this;
+    }
+
+    public OptionsPickerBuilder setSelectOptions(int option1, int option2) {
+        mPickerOptions.option1 = option1;
+        mPickerOptions.option2 = option2;
+        return this;
+    }
+
+    public OptionsPickerBuilder setSelectOptions(int option1, int option2, int option3) {
+        mPickerOptions.option1 = option1;
+        mPickerOptions.option2 = option2;
+        mPickerOptions.option3 = option3;
+        return this;
+    }
+
+    public OptionsPickerBuilder setTextXOffset(int xoffset_one, int xoffset_two, int xoffset_three) {
+        mPickerOptions.x_offset_one = xoffset_one;
+        mPickerOptions.x_offset_two = xoffset_two;
+        mPickerOptions.x_offset_three = xoffset_three;
+        return this;
+    }
+
+    public OptionsPickerBuilder isCenterLabel(boolean isCenterLabel) {
+        mPickerOptions.isCenterLabel = isCenterLabel;
+        return this;
+    }
+
+
+    /**
+     * 设置最大可见数目
+     *
+     * @param count 建议设置为 3 ~ 9之间。
+     */
+    public OptionsPickerBuilder setItemVisibleCount(int count) {
+        mPickerOptions.itemsVisibleCount = count;
+        return this;
+    }
+
+    /**
+     * 透明度是否渐变
+     *
+     * @param isAlphaGradient true of false
+     */
+    public OptionsPickerBuilder isAlphaGradient(boolean isAlphaGradient) {
+        mPickerOptions.isAlphaGradient = isAlphaGradient;
+        return this;
+    }
+
+    /**
+     * 切换选项时,是否还原第一项
+     *
+     * @param isRestoreItem true:还原; false: 保持上一个选项
+     * @return TimePickerBuilder
+     */
+    public OptionsPickerBuilder isRestoreItem(boolean isRestoreItem) {
+        mPickerOptions.isRestoreItem = isRestoreItem;
+        return this;
+    }
+
+    /**
+     * @param listener 切换item项滚动停止时,实时回调监听。
+     * @return
+     */
+    public OptionsPickerBuilder setOptionsSelectChangeListener(OnOptionsSelectChangeListener listener) {
+        mPickerOptions.optionsSelectChangeListener = listener;
+        return this;
+    }
+
+
+    public <T> OptionsPickerView<T> build() {
+        return new OptionsPickerView<>(mPickerOptions);
+    }
+}

+ 327 - 0
pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java

@@ -0,0 +1,327 @@
+package com.bigkoo.pickerview.builder;
+
+import android.content.Context;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.bigkoo.pickerview.configure.PickerOptions;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.CustomListener2;
+import com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectListener;
+import com.bigkoo.pickerview.view.TimePickerView;
+import com.contrarywind.view.WheelView;
+
+import java.util.Calendar;
+
+import androidx.annotation.ColorInt;
+
+/**
+ * Created by xiaosongzeem on 2018/3/20.
+ */
+
+public class TimePickerBuilder {
+
+    private PickerOptions mPickerOptions;
+
+    //Required
+    public TimePickerBuilder(Context context, OnTimeSelectListener listener) {
+        mPickerOptions = new PickerOptions(PickerOptions.TYPE_PICKER_TIME);
+        mPickerOptions.context = context;
+        mPickerOptions.timeSelectListener = listener;
+    }
+
+    //Option
+    public TimePickerBuilder setGravity(int gravity) {
+        mPickerOptions.textGravity = gravity;
+        return this;
+    }
+
+    public TimePickerBuilder addOnCancelClickListener(View.OnClickListener cancelListener) {
+        mPickerOptions.cancelListener = cancelListener;
+        return this;
+    }
+
+    /**
+     * new boolean[]{true, true, true, false, false, false}
+     * control the "year","month","day","hours","minutes","seconds " display or hide.
+     * 分别控制“年”“月”“日”“时”“分”“秒”的显示或隐藏。
+     *
+     * @param type 布尔型数组,长度需要设置为6。
+     * @return TimePickerBuilder
+     */
+    public TimePickerBuilder setType(boolean[] type) {
+        mPickerOptions.type = type;
+        return this;
+    }
+
+    public TimePickerBuilder setSubmitText(String textContentConfirm) {
+        mPickerOptions.textContentConfirm = textContentConfirm;
+        return this;
+    }
+
+    public TimePickerBuilder isDialog(boolean isDialog) {
+        mPickerOptions.isDialog = isDialog;
+        return this;
+    }
+
+    public TimePickerBuilder setCancelText(String textContentCancel) {
+        mPickerOptions.textContentCancel = textContentCancel;
+        return this;
+    }
+
+    public TimePickerBuilder setTitleText(String textContentTitle) {
+        mPickerOptions.textContentTitle = textContentTitle;
+        return this;
+    }
+
+    public TimePickerBuilder setSubmitColor(int textColorConfirm) {
+        mPickerOptions.textColorConfirm = textColorConfirm;
+        return this;
+    }
+
+    public TimePickerBuilder setCancelColor(int textColorCancel) {
+        mPickerOptions.textColorCancel = textColorCancel;
+        return this;
+    }
+
+    /**
+     * ViewGroup 类型的容器
+     *
+     * @param decorView 选择器会被添加到此容器中
+     * @return TimePickerBuilder
+     */
+    public TimePickerBuilder setDecorView(ViewGroup decorView) {
+        mPickerOptions.decorView = decorView;
+        return this;
+    }
+
+    public TimePickerBuilder setBgColor(int bgColorWheel) {
+        mPickerOptions.bgColorWheel = bgColorWheel;
+        return this;
+    }
+
+    public TimePickerBuilder setTitleBgColor(int bgColorTitle) {
+        mPickerOptions.bgColorTitle = bgColorTitle;
+        return this;
+    }
+
+    public TimePickerBuilder setTitleColor(int textColorTitle) {
+        mPickerOptions.textColorTitle = textColorTitle;
+        return this;
+    }
+
+    public TimePickerBuilder setSubCalSize(int textSizeSubmitCancel) {
+        mPickerOptions.textSizeSubmitCancel = textSizeSubmitCancel;
+        return this;
+    }
+
+    public TimePickerBuilder setTitleSize(int textSizeTitle) {
+        mPickerOptions.textSizeTitle = textSizeTitle;
+        return this;
+    }
+
+    public TimePickerBuilder setContentTextSize(int textSizeContent) {
+        mPickerOptions.textSizeContent = textSizeContent;
+        return this;
+    }
+
+    /**
+     * 设置最大可见数目
+     *
+     * @param count suggest value: 3, 5, 7, 9
+     */
+    public TimePickerBuilder setItemVisibleCount(int count) {
+        mPickerOptions.itemsVisibleCount = count;
+        return this;
+    }
+
+    /**
+     * 透明度是否渐变
+     *
+     * @param isAlphaGradient true of false
+     */
+    public TimePickerBuilder isAlphaGradient(boolean isAlphaGradient) {
+        mPickerOptions.isAlphaGradient = isAlphaGradient;
+        return this;
+    }
+
+    /**
+     * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
+     *
+     * @param date
+     * @return TimePickerBuilder
+     */
+    public TimePickerBuilder setDate(Calendar date) {
+        mPickerOptions.date = date;
+        return this;
+    }
+
+    public TimePickerBuilder setLayoutRes(int res, CustomListener customListener) {
+        mPickerOptions.layoutRes = res;
+        mPickerOptions.customListener = customListener;
+        return this;
+    }
+
+    public TimePickerBuilder setLayoutRes(int res, CustomListener2 listener) {
+        mPickerOptions.layoutRes = res;
+        mPickerOptions.customListener2 = listener;
+        return this;
+    }
+
+
+    /**
+     * 设置起始时间
+     * 因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11
+     */
+
+    public TimePickerBuilder setRangDate(Calendar startDate, Calendar endDate) {
+        mPickerOptions.startDate = startDate;
+        mPickerOptions.endDate = endDate;
+        return this;
+    }
+
+
+    /**
+     * 设置间距倍数,但是只能在1.0-4.0f之间
+     *
+     * @param lineSpacingMultiplier
+     */
+    public TimePickerBuilder setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        mPickerOptions.lineSpacingMultiplier = lineSpacingMultiplier;
+        return this;
+    }
+
+    /**
+     * 设置分割线的颜色
+     *
+     * @param dividerColor
+     */
+
+    public TimePickerBuilder setDividerColor(@ColorInt int dividerColor) {
+        mPickerOptions.dividerColor = dividerColor;
+        return this;
+    }
+
+    public TimePickerBuilder setDividerPadding(int dividerPadding) {
+        mPickerOptions.dividerPadding = dividerPadding;
+        return this;
+    }
+
+    /**
+     * 设置分割线的类型
+     *
+     * @param dividerType
+     */
+    public TimePickerBuilder setDividerType(WheelView.DividerType dividerType) {
+        mPickerOptions.dividerType = dividerType;
+        return this;
+    }
+
+    /**
+     * {@link #setOutSideColor} instead.
+     *
+     * @param backgroundId color resId.
+     */
+    @Deprecated
+    public TimePickerBuilder setBackgroundId(int backgroundId) {
+        mPickerOptions.outSideColor = backgroundId;
+        return this;
+    }
+
+    /**
+     * 显示时的外部背景色颜色,默认是灰色
+     *
+     * @param outSideColor
+     */
+    public TimePickerBuilder setOutSideColor(@ColorInt int outSideColor) {
+        mPickerOptions.outSideColor = outSideColor;
+        return this;
+    }
+
+    /**
+     * 设置分割线之间的文字的颜色
+     *
+     * @param textColorCenter
+     */
+    public TimePickerBuilder setTextColorCenter(@ColorInt int textColorCenter) {
+        mPickerOptions.textColorCenter = textColorCenter;
+        return this;
+    }
+
+    /**
+     * 设置分割线以外文字的颜色
+     *
+     * @param textColorOut
+     */
+    public TimePickerBuilder setTextColorOut(@ColorInt int textColorOut) {
+        mPickerOptions.textColorOut = textColorOut;
+        return this;
+    }
+
+    public TimePickerBuilder isCyclic(boolean cyclic) {
+        mPickerOptions.cyclic = cyclic;
+        return this;
+    }
+
+    public TimePickerBuilder setOutSideCancelable(boolean cancelable) {
+        mPickerOptions.cancelable = cancelable;
+        return this;
+    }
+
+    public TimePickerBuilder setLunarCalendar(boolean lunarCalendar) {
+        mPickerOptions.isLunarCalendar = lunarCalendar;
+        return this;
+    }
+
+
+    public TimePickerBuilder setLabel(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) {
+        mPickerOptions.label_year = label_year;
+        mPickerOptions.label_month = label_month;
+        mPickerOptions.label_day = label_day;
+        mPickerOptions.label_hours = label_hours;
+        mPickerOptions.label_minutes = label_mins;
+        mPickerOptions.label_seconds = label_seconds;
+        return this;
+    }
+
+    /**
+     * 设置X轴倾斜角度[ -90 , 90°]
+     *
+     * @param x_offset_year    年
+     * @param x_offset_month   月
+     * @param x_offset_day     日
+     * @param x_offset_hours   时
+     * @param x_offset_minutes 分
+     * @param x_offset_seconds 秒
+     * @return
+     */
+    public TimePickerBuilder setTextXOffset(int x_offset_year, int x_offset_month, int x_offset_day,
+                                            int x_offset_hours, int x_offset_minutes, int x_offset_seconds) {
+        mPickerOptions.x_offset_year = x_offset_year;
+        mPickerOptions.x_offset_month = x_offset_month;
+        mPickerOptions.x_offset_day = x_offset_day;
+        mPickerOptions.x_offset_hours = x_offset_hours;
+        mPickerOptions.x_offset_minutes = x_offset_minutes;
+        mPickerOptions.x_offset_seconds = x_offset_seconds;
+        return this;
+    }
+
+    public TimePickerBuilder isCenterLabel(boolean isCenterLabel) {
+        mPickerOptions.isCenterLabel = isCenterLabel;
+        return this;
+    }
+
+    /**
+     * @param listener 切换item项滚动停止时,实时回调监听。
+     * @return
+     */
+    public TimePickerBuilder setTimeSelectChangeListener(OnTimeSelectChangeListener listener) {
+        mPickerOptions.timeSelectChangeListener = listener;
+        return this;
+    }
+
+    public TimePickerView build() {
+        return new TimePickerView(mPickerOptions);
+    }
+}

+ 117 - 0
pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java

@@ -0,0 +1,117 @@
+package com.bigkoo.pickerview.configure;
+
+import android.content.Context;
+import android.graphics.Typeface;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.listener.CustomListener;
+import com.bigkoo.pickerview.listener.CustomListener2;
+import com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;
+import com.bigkoo.pickerview.listener.OnOptionsSelectListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectChangeListener;
+import com.bigkoo.pickerview.listener.OnTimeSelectListener;
+import com.contrarywind.view.WheelView;
+
+import java.util.Calendar;
+
+/**
+ * Build Options
+ * Created by xiaosongzeem on 2018/3/8.
+ */
+
+public class PickerOptions {
+
+    //constant
+    private static final int PICKER_VIEW_BTN_COLOR_NORMAL = 0xFF057dff;
+    private static final int PICKER_VIEW_BG_COLOR_TITLE = 0xFFf5f5f5;
+    private static final int PICKER_VIEW_COLOR_TITLE = 0xFF000000;
+    private static final int PICKER_VIEW_BG_COLOR_DEFAULT = 0xFFFFFFFF;
+
+    public static final int TYPE_PICKER_OPTIONS = 1;
+    public static final int TYPE_PICKER_TIME = 2;
+
+    public OnOptionsSelectListener optionsSelectListener;
+    public OnTimeSelectListener timeSelectListener;
+    public View.OnClickListener cancelListener;
+
+    public OnTimeSelectChangeListener timeSelectChangeListener;
+    public OnOptionsSelectChangeListener optionsSelectChangeListener;
+    public CustomListener customListener;
+    public CustomListener2 customListener2;
+
+    //options picker
+    public String label1, label2, label3;//单位字符
+    public int option1, option2, option3;//默认选中项
+    public int x_offset_one, x_offset_two, x_offset_three;//x轴偏移量
+
+    public boolean cyclic1 = false;//是否循环,默认否
+    public boolean cyclic2 = false;
+    public boolean cyclic3 = false;
+
+    public boolean isRestoreItem = false; //切换时,还原第一项
+
+
+    //time picker
+    public boolean[] type = new boolean[]{true, true, true, false, false, false};//显示类型,默认显示: 年月日
+
+    public Calendar date;//当前选中时间
+    public Calendar startDate;//开始时间
+    public Calendar endDate;//终止时间
+    public int startYear;//开始年份
+    public int endYear;//结尾年份
+
+    public boolean cyclic = false;//是否循环
+    public boolean isLunarCalendar = false;//是否显示农历
+
+    public String label_year, label_month, label_day, label_hours, label_minutes, label_seconds;//单位
+    public int x_offset_year, x_offset_month, x_offset_day, x_offset_hours, x_offset_minutes, x_offset_seconds;//单位
+
+
+    public PickerOptions(int buildType) {
+        if (buildType == TYPE_PICKER_OPTIONS) {
+            layoutRes = R.layout.pickerview_options;
+        } else {
+            layoutRes = R.layout.pickerview_time;
+        }
+    }
+
+    //******* general field ******//
+    public int layoutRes;
+    public ViewGroup decorView;
+    public int textGravity = Gravity.CENTER;
+    public Context context;
+
+    public String textContentConfirm;//确定按钮文字
+    public String textContentCancel;//取消按钮文字
+    public String textContentTitle;//标题文字
+
+    public int textColorConfirm = PICKER_VIEW_BTN_COLOR_NORMAL;//确定按钮颜色
+    public int textColorCancel = PICKER_VIEW_BTN_COLOR_NORMAL;//取消按钮颜色
+    public int textColorTitle = PICKER_VIEW_COLOR_TITLE;//标题颜色
+
+    public int bgColorWheel = PICKER_VIEW_BG_COLOR_DEFAULT;//滚轮背景颜色
+    public int bgColorTitle = PICKER_VIEW_BG_COLOR_TITLE;//标题背景颜色
+
+    public int textSizeSubmitCancel = 17;//确定取消按钮大小
+    public int textSizeTitle = 18;//标题文字大小
+    public int textSizeContent = 16;//内容文字大小
+
+    public int textColorOut = 0xFFa8a8a8; //分割线以外的文字颜色
+    public int textColorCenter = 0xFF2a2a2a; //分割线之间的文字颜色
+    public int dividerColor = 0xFFd5d5d5; //分割线的颜色
+    public int outSideColor = -1; //显示时的外部背景色颜色,默认是灰色
+    public int dividerPadding = 0; //两边间距
+
+    public float lineSpacingMultiplier = 2.7f; // 条目间距倍数 默认2.7f
+    public boolean isDialog;//是否是对话框模式
+
+    public boolean cancelable = true;//是否能取消
+    public boolean isCenterLabel = false;//是否只显示中间的label,默认每个item都显示
+    public Typeface font = Typeface.MONOSPACE;//字体样式
+    public WheelView.DividerType dividerType = WheelView.DividerType.FILL;//分隔线类型
+    public int itemsVisibleCount = 9; //最大可见条目数
+    public boolean isAlphaGradient = false; //透明度渐变
+}

+ 13 - 0
pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener.java

@@ -0,0 +1,13 @@
+package com.bigkoo.pickerview.listener;
+
+import android.view.View;
+
+/**
+ * Created by KyuYi on 2017/3/2.
+ * E-Mail:kyu_yi@sina.com
+ * 功能:
+ */
+
+public interface CustomListener {
+    void customLayout(View v);
+}

+ 15 - 0
pickerview/src/main/java/com/bigkoo/pickerview/listener/CustomListener2.java

@@ -0,0 +1,15 @@
+package com.bigkoo.pickerview.listener;
+
+import android.view.View;
+
+import com.bigkoo.pickerview.view.BasePickerView;
+
+/**
+ * Created by KyuYi on 2017/3/2.
+ * E-Mail:kyu_yi@sina.com
+ * 功能:
+ */
+
+public interface CustomListener2 {
+    void customLayout(BasePickerView pickerView,View v);
+}

+ 10 - 0
pickerview/src/main/java/com/bigkoo/pickerview/listener/ISelectTimeCallback.java

@@ -0,0 +1,10 @@
+package com.bigkoo.pickerview.listener;
+
+/**
+ * Created by zengsong on 2018/3/21.
+ */
+
+public interface ISelectTimeCallback {
+
+    public void onTimeSelectChanged();
+}

+ 10 - 0
pickerview/src/main/java/com/bigkoo/pickerview/listener/OnDismissListener.java

@@ -0,0 +1,10 @@
+package com.bigkoo.pickerview.listener;
+
+/**
+ * Created by Sai on 15/8/9.
+ */
+public interface OnDismissListener {
+    void onDismiss(Object o);
+
+    void onShow();
+}

+ 11 - 0
pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectChangeListener.java

@@ -0,0 +1,11 @@
+package com.bigkoo.pickerview.listener;
+
+/**
+ * Created by xiaosong on 2018/3/20.
+ */
+
+public interface OnOptionsSelectChangeListener {
+
+    void onOptionsSelectChanged(int options1, int options2, int options3);
+
+}

+ 13 - 0
pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectListener.java

@@ -0,0 +1,13 @@
+package com.bigkoo.pickerview.listener;
+
+import android.view.View;
+
+/**
+ * Created by xiaosong on 2018/3/20.
+ */
+
+public interface OnOptionsSelectListener {
+
+    void onOptionsSelect(int options1, int options2, int options3, View v);
+
+}

+ 12 - 0
pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectChangeListener.java

@@ -0,0 +1,12 @@
+package com.bigkoo.pickerview.listener;
+
+import java.util.Date;
+
+/**
+ * Created by xiaosong on 2018/3/20.
+ */
+
+public interface OnTimeSelectChangeListener {
+
+    void onTimeSelectChanged(Date date);
+}

+ 14 - 0
pickerview/src/main/java/com/bigkoo/pickerview/listener/OnTimeSelectListener.java

@@ -0,0 +1,14 @@
+package com.bigkoo.pickerview.listener;
+
+import android.view.View;
+
+import java.util.Date;
+
+/**
+ * Created by xiaosong on 2018/3/20.
+ */
+
+public interface OnTimeSelectListener {
+
+    void onTimeSelect(Date date, View v);
+}

+ 352 - 0
pickerview/src/main/java/com/bigkoo/pickerview/utils/ChinaDate.java

@@ -0,0 +1,352 @@
+package com.bigkoo.pickerview.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.Locale;
+
+public class ChinaDate {
+
+    /**
+     * <lunarInfo 数组值的计算原理>
+     *
+     * 0x代表十六进制,后面的五位数是十六进制数。
+     * 举个例子: 1980年的数据是 0x095b0
+     * 二进制:  0000 1001 0101 1011 0000
+     * 1-4:   表示当年是否为闰年,是的话为1,否则为0。
+     * 5-16: 为除了闰月外的正常月份是大月还是小月,1为30天,0为29天。
+     * 注意:  从1月到12月对应的是第16位到第5位。
+     * 17-20: 非闰年为0,大于0表示闰月月份,仅当存在闰月的情况下有意义。
+     */
+    final private static long[] lunarInfo = new long[]{
+            0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,//1900-1909
+            0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,//1910-1919
+            0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,//1920-1929
+            0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,//1930-1939
+            0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,//1940-1949
+            0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,//1950-1959
+            0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,//1960-1969
+            0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6,//1970-1979
+            0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,//1980-1989
+            0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,//1990-1999
+            0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,//2000-2009
+            0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,//2010-2019
+            0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,//2020-2029
+            0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,//2030-2039
+            0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0,//2040-2049
+            0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0,//2050-2059
+            0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4,//2060-2069
+            0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0,//2070-2079
+            0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160,//2080-2089
+            0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,//2090-2099
+            0x0d520};//2100
+
+    private final static String[] nStr1 = new String[]{"", "正", "二", "三", "四",
+            "五", "六", "七", "八", "九", "十", "冬", "腊"};
+    private final static String[] Gan = new String[]{"甲", "乙", "丙", "丁", "戊",
+            "己", "庚", "辛", "壬", "癸"};
+    private final static String[] Zhi = new String[]{"子", "丑", "寅", "卯", "辰",
+            "巳", "午", "未", "申", "酉", "戌", "亥"};
+    private final static String[] Animals = new String[]{"鼠", "牛", "虎", "兔",
+            "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};
+
+    /**
+     * 传回农历
+     *
+     * @param y 年的总天数
+     * @return 农历
+     */
+    final private static int lYearDays(int y) {
+        int i, sum = 348;
+        for (i = 0x8000; i > 0x8; i >>= 1) {
+            if ((lunarInfo[y - 1900] & i) != 0)
+                sum += 1;
+        }
+        return (sum + leapDays(y));
+    }
+
+    /**
+     * 传回农历
+     *
+     * @param y 年闰月的天数
+     * @return 农历
+     */
+    final public static int leapDays(int y) {
+        if (leapMonth(y) != 0) {
+            if ((lunarInfo[y - 1900] & 0x10000) != 0)
+                return 30;
+            else
+                return 29;
+        } else
+            return 0;
+    }
+
+    /**
+     * 传回农历
+     *
+     * @param y 年闰哪个月 1-12 , 没闰传回 0
+     * @return 农历
+     */
+    final public static int leapMonth(int y) {
+        return (int) (lunarInfo[y - 1900] & 0xf);
+    }
+
+    /**
+     * 传回农历 y
+     *
+     * @param y y年m月的总天数
+     * @param m y年m月的总天数
+     * @return 农历
+     */
+    final public static int monthDays(int y, int m) {
+        if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
+            return 29;
+        else
+            return 30;
+    }
+
+    /**
+     * 传回农历
+     *
+     * @param y 年的生肖
+     * @return
+     */
+    final public static String AnimalsYear(int y) {
+        return Animals[(y - 4) % 12];
+    }
+
+    /**
+     * 传入
+     *
+     * @param num 月日的offset 传回干支,0是甲子
+     * @return 干支
+     */
+    final private static String cyclicalm(int num) {
+        return (Gan[num % 10] + Zhi[num % 12]);
+    }
+
+    /**
+     * 传入 offset 传回干支
+     *
+     * @param y 0是甲子
+     * @return 干支
+     */
+    final public static String cyclical(int y) {
+        int num = y - 1900 + 36;
+        return (cyclicalm(num));
+    }
+
+
+    /**
+     * 传出y年m月d日对应的农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
+     *
+     * @param y 年
+     * @param m 月
+     * @param d 日
+     * @return y年m月d日对应的农历
+     */
+    final public static long[] calElement(int y, int m, int d) {
+        long[] nongDate = new long[7];
+        int i = 0, temp = 0, leap = 0;
+        Date baseDate = new GregorianCalendar(0 + 1900, 0, 31).getTime();
+        Date objDate = new GregorianCalendar(y, m - 1, d).getTime();
+        long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L;
+        nongDate[5] = offset + 40;
+        nongDate[4] = 14;
+        for (i = 1900; i < 2100 && offset > 0; i++) {
+            temp = lYearDays(i);
+            offset -= temp;
+            nongDate[4] += 12;
+        }
+        if (offset < 0) {
+            offset += temp;
+            i--;
+            nongDate[4] -= 12;
+        }
+        nongDate[0] = i;
+        nongDate[3] = i - 1864;
+        leap = leapMonth(i); // 闰哪个月
+        nongDate[6] = 0;
+        for (i = 1; i < 13 && offset > 0; i++) {
+            // 闰月
+            if (leap > 0 && i == (leap + 1) && nongDate[6] == 0) {
+                --i;
+                nongDate[6] = 1;
+                temp = leapDays((int) nongDate[0]);
+            } else {
+                temp = monthDays((int) nongDate[0], i);
+            }
+            // 解除闰月
+            if (nongDate[6] == 1 && i == (leap + 1))
+                nongDate[6] = 0;
+            offset -= temp;
+            if (nongDate[6] == 0)
+                nongDate[4]++;
+        }
+        if (offset == 0 && leap > 0 && i == leap + 1) {
+            if (nongDate[6] == 1) {
+                nongDate[6] = 0;
+            } else {
+                nongDate[6] = 1;
+                --i;
+                --nongDate[4];
+            }
+        }
+        if (offset < 0) {
+            offset += temp;
+            --i;
+            --nongDate[4];
+        }
+        nongDate[1] = i;
+        nongDate[2] = offset + 1;
+        return nongDate;
+    }
+
+    public final static String getChinaDate(int day) {
+        String a = "";
+        if (day == 10)
+            return "初十";
+        if (day == 20)
+            return "二十";
+        if (day == 30)
+            return "三十";
+        int two = (int) ((day) / 10);
+        if (two == 0)
+            a = "初";
+        if (two == 1)
+            a = "十";
+        if (two == 2)
+            a = "廿";
+        if (two == 3)
+            a = "三";
+        int one = (int) (day % 10);
+        switch (one) {
+            case 1:
+                a += "一";
+                break;
+            case 2:
+                a += "二";
+                break;
+            case 3:
+                a += "三";
+                break;
+            case 4:
+                a += "四";
+                break;
+            case 5:
+                a += "五";
+                break;
+            case 6:
+                a += "六";
+                break;
+            case 7:
+                a += "七";
+                break;
+            case 8:
+                a += "八";
+                break;
+            case 9:
+                a += "九";
+                break;
+        }
+        return a;
+    }
+
+    public static String getCurrentLunarDate() {
+        Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);
+        int year = today.get(Calendar.YEAR);
+        int month = today.get(Calendar.MONTH) + 1;
+        int date = today.get(Calendar.DATE);
+        long[] l = calElement(year, month, date);
+        StringBuffer sToday = new StringBuffer();
+        try {
+            sToday.append(sdf.format(today.getTime()));
+            sToday.append(" 农历");
+            sToday.append(cyclical(year));
+            sToday.append('(');
+            sToday.append(AnimalsYear(year));
+            sToday.append(")年");
+            sToday.append(nStr1[(int) l[1]]);
+            sToday.append("月");
+            sToday.append(getChinaDate((int) (l[2])));
+            return sToday.toString();
+        } finally {
+            sToday = null;
+        }
+    }
+
+    public static String oneDay(int year, int month, int day) {
+        //   Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);
+        long[] l = calElement(year, month, day);
+        StringBuffer sToday = new StringBuffer();
+        try {
+            //   sToday.append(sdf.format(today.getTime()));
+            sToday.append(" 农历");
+            sToday.append(cyclical(year));
+            sToday.append('(');
+            sToday.append(AnimalsYear(year));
+            sToday.append(")年");
+            sToday.append(nStr1[(int) l[1]]);
+            sToday.append("月");
+            sToday.append(getChinaDate((int) (l[2])));
+            return sToday.toString();
+        } finally {
+            sToday = null;
+        }
+    }
+
+    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日 EEEEE");
+
+
+    /**
+     * @param lunarYear 农历年份
+     * @return String of Ganzhi: 甲子年
+     * 甲乙丙丁戊己庚辛壬癸
+     * 子丑寅卯辰巳无为申酉戌亥
+     */
+    public static String getLunarYearText(int lunarYear) {
+        return Gan[(lunarYear - 4) % 10] + Zhi[(lunarYear - 4) % 12] + "年";
+    }
+
+
+    public static ArrayList<String> getYears(int startYear, int endYear) {
+        ArrayList<String> years = new ArrayList<>();
+        for (int i = startYear; i < endYear; i++) {
+            years.add(String.format("%s(%d)", getLunarYearText(i), i));
+        }
+        return years;
+    }
+
+    /**
+     * 获取year年的所有月份
+     *
+     * @param year 年
+     * @return 月份列表
+     */
+    public static ArrayList<String> getMonths(int year) {
+        ArrayList<String> baseMonths = new ArrayList<>();
+        for (int i = 1; i < nStr1.length; i++) {
+            baseMonths.add(nStr1[i] + "月");
+        }
+        if (leapMonth(year) != 0) {
+            baseMonths.add(leapMonth(year), "闰" + nStr1[leapMonth(year)] + "月");
+        }
+        return baseMonths;
+    }
+
+    /**
+     * 获取每月农历显示名称
+     *
+     * @param maxDay 天
+     * @return 名称列表
+     */
+    public static ArrayList<String> getLunarDays(int maxDay) {
+        ArrayList<String> days = new ArrayList<>();
+        for (int i = 1; i <= maxDay; i++) {
+            days.add(getChinaDate(i));
+        }
+        return days;
+    }
+}

+ 429 - 0
pickerview/src/main/java/com/bigkoo/pickerview/utils/LunarCalendar.java

@@ -0,0 +1,429 @@
+package com.bigkoo.pickerview.utils;
+
+import android.util.Log;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ * author: Jerry on 2016/7/11 11:29.
+ * description:工具类,实现公农历互转
+ */
+public class LunarCalendar {
+
+    /**
+     * 支持转换的最小农历年份
+     */
+    public static final int MIN_YEAR = 1900;
+    /**
+     * 支持转换的最大农历年份
+     */
+    public static final int MAX_YEAR = 2099;
+
+    /**
+     * 公历每月前的天数
+     */
+    private static final int DAYS_BEFORE_MONTH[] = {0, 31, 59, 90, 120, 151, 181,
+            212, 243, 273, 304, 334, 365};
+
+    /**
+     * 用来表示1900年到2099年间农历年份的相关信息,共24位bit的16进制表示,其中:
+     * 1. 前4位表示该年闰哪个月;
+     * 2. 5-17位表示农历年份13个月的大小月分布,0表示小,1表示大;
+     * 3. 最后7位表示农历年首(正月初一)对应的公历日期。
+     * <p>
+     * 以2014年的数据0x955ABF为例说明:
+     * 1001 0101 0101 1010 1011 1111
+     * 闰九月  农历正月初一对应公历1月31号
+     */
+    private static final int LUNAR_INFO[] = {
+            0x84B6BF,/*1900*/
+            0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A,/*1901-1910*/
+            0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754,/*1911-1920*/
+            0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E,/*1921-1930*/
+            0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48,/*1931-1940*/
+            0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51,/*1941-1950*/
+            0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C,/*1951-1960*/
+            0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46,/*1961-1970*/
+            0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50,/*1971-1980*/
+            0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x095746, 0x5497BB,/*1981-1990*/
+            0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645,/*1991-2000*/
+            0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E,/*2001-2010*/
+            0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9,/*2011-2020*/
+            0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x6a573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43,/*2021-2030*/
+            0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C,/*2031-2040*/
+            0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37,/*2041-2050*/
+            0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06AA44, 0x4AB638, 0x0AAE4C, 0x092E42,/*2051-2060*/
+            0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B,/*2061-2070*/
+            0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6,/*2071-2080*/
+            0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E,/*2081-2090*/
+            0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5          /*2091-2099*/
+    };
+    private static int[] solar_1_1 = {1887, 0xec04c, 0xec23f, 0xec435, 0xec649,
+            0xec83e, 0xeca51, 0xecc46, 0xece3a, 0xed04d, 0xed242, 0xed436,
+            0xed64a, 0xed83f, 0xeda53, 0xedc48, 0xede3d, 0xee050, 0xee244,
+            0xee439, 0xee64d, 0xee842, 0xeea36, 0xeec4a, 0xeee3e, 0xef052,
+            0xef246, 0xef43a, 0xef64e, 0xef843, 0xefa37, 0xefc4b, 0xefe41,
+            0xf0054, 0xf0248, 0xf043c, 0xf0650, 0xf0845, 0xf0a38, 0xf0c4d,
+            0xf0e42, 0xf1037, 0xf124a, 0xf143e, 0xf1651, 0xf1846, 0xf1a3a,
+            0xf1c4e, 0xf1e44, 0xf2038, 0xf224b, 0xf243f, 0xf2653, 0xf2848,
+            0xf2a3b, 0xf2c4f, 0xf2e45, 0xf3039, 0xf324d, 0xf3442, 0xf3636,
+            0xf384a, 0xf3a3d, 0xf3c51, 0xf3e46, 0xf403b, 0xf424e, 0xf4443,
+            0xf4638, 0xf484c, 0xf4a3f, 0xf4c52, 0xf4e48, 0xf503c, 0xf524f,
+            0xf5445, 0xf5639, 0xf584d, 0xf5a42, 0xf5c35, 0xf5e49, 0xf603e,
+            0xf6251, 0xf6446, 0xf663b, 0xf684f, 0xf6a43, 0xf6c37, 0xf6e4b,
+            0xf703f, 0xf7252, 0xf7447, 0xf763c, 0xf7850, 0xf7a45, 0xf7c39,
+            0xf7e4d, 0xf8042, 0xf8254, 0xf8449, 0xf863d, 0xf8851, 0xf8a46,
+            0xf8c3b, 0xf8e4f, 0xf9044, 0xf9237, 0xf944a, 0xf963f, 0xf9853,
+            0xf9a47, 0xf9c3c, 0xf9e50, 0xfa045, 0xfa238, 0xfa44c, 0xfa641,
+            0xfa836, 0xfaa49, 0xfac3d, 0xfae52, 0xfb047, 0xfb23a, 0xfb44e,
+            0xfb643, 0xfb837, 0xfba4a, 0xfbc3f, 0xfbe53, 0xfc048, 0xfc23c,
+            0xfc450, 0xfc645, 0xfc839, 0xfca4c, 0xfcc41, 0xfce36, 0xfd04a,
+            0xfd23d, 0xfd451, 0xfd646, 0xfd83a, 0xfda4d, 0xfdc43, 0xfde37,
+            0xfe04b, 0xfe23f, 0xfe453, 0xfe648, 0xfe83c, 0xfea4f, 0xfec44,
+            0xfee38, 0xff04c, 0xff241, 0xff436, 0xff64a, 0xff83e, 0xffa51,
+            0xffc46, 0xffe3a, 0x10004e, 0x100242, 0x100437, 0x10064b, 0x100841,
+            0x100a53, 0x100c48, 0x100e3c, 0x10104f, 0x101244, 0x101438,
+            0x10164c, 0x101842, 0x101a35, 0x101c49, 0x101e3d, 0x102051,
+            0x102245, 0x10243a, 0x10264e, 0x102843, 0x102a37, 0x102c4b,
+            0x102e3f, 0x103053, 0x103247, 0x10343b, 0x10364f, 0x103845,
+            0x103a38, 0x103c4c, 0x103e42, 0x104036, 0x104249, 0x10443d,
+            0x104651, 0x104846, 0x104a3a, 0x104c4e, 0x104e43, 0x105038,
+            0x10524a, 0x10543e, 0x105652, 0x105847, 0x105a3b, 0x105c4f,
+            0x105e45, 0x106039, 0x10624c, 0x106441, 0x106635, 0x106849,
+            0x106a3d, 0x106c51, 0x106e47, 0x10703c, 0x10724f, 0x107444,
+            0x107638, 0x10784c, 0x107a3f, 0x107c53, 0x107e48};
+    private static int[] lunar_month_days = {1887, 0x1694, 0x16aa, 0x4ad5,
+            0xab6, 0xc4b7, 0x4ae, 0xa56, 0xb52a, 0x1d2a, 0xd54, 0x75aa, 0x156a,
+            0x1096d, 0x95c, 0x14ae, 0xaa4d, 0x1a4c, 0x1b2a, 0x8d55, 0xad4,
+            0x135a, 0x495d, 0x95c, 0xd49b, 0x149a, 0x1a4a, 0xbaa5, 0x16a8,
+            0x1ad4, 0x52da, 0x12b6, 0xe937, 0x92e, 0x1496, 0xb64b, 0xd4a,
+            0xda8, 0x95b5, 0x56c, 0x12ae, 0x492f, 0x92e, 0xcc96, 0x1a94,
+            0x1d4a, 0xada9, 0xb5a, 0x56c, 0x726e, 0x125c, 0xf92d, 0x192a,
+            0x1a94, 0xdb4a, 0x16aa, 0xad4, 0x955b, 0x4ba, 0x125a, 0x592b,
+            0x152a, 0xf695, 0xd94, 0x16aa, 0xaab5, 0x9b4, 0x14b6, 0x6a57,
+            0xa56, 0x1152a, 0x1d2a, 0xd54, 0xd5aa, 0x156a, 0x96c, 0x94ae,
+            0x14ae, 0xa4c, 0x7d26, 0x1b2a, 0xeb55, 0xad4, 0x12da, 0xa95d,
+            0x95a, 0x149a, 0x9a4d, 0x1a4a, 0x11aa5, 0x16a8, 0x16d4, 0xd2da,
+            0x12b6, 0x936, 0x9497, 0x1496, 0x1564b, 0xd4a, 0xda8, 0xd5b4,
+            0x156c, 0x12ae, 0xa92f, 0x92e, 0xc96, 0x6d4a, 0x1d4a, 0x10d65,
+            0xb58, 0x156c, 0xb26d, 0x125c, 0x192c, 0x9a95, 0x1a94, 0x1b4a,
+            0x4b55, 0xad4, 0xf55b, 0x4ba, 0x125a, 0xb92b, 0x152a, 0x1694,
+            0x96aa, 0x15aa, 0x12ab5, 0x974, 0x14b6, 0xca57, 0xa56, 0x1526,
+            0x8e95, 0xd54, 0x15aa, 0x49b5, 0x96c, 0xd4ae, 0x149c, 0x1a4c,
+            0xbd26, 0x1aa6, 0xb54, 0x6d6a, 0x12da, 0x1695d, 0x95a, 0x149a,
+            0xda4b, 0x1a4a, 0x1aa4, 0xbb54, 0x16b4, 0xada, 0x495b, 0x936,
+            0xf497, 0x1496, 0x154a, 0xb6a5, 0xda4, 0x15b4, 0x6ab6, 0x126e,
+            0x1092f, 0x92e, 0xc96, 0xcd4a, 0x1d4a, 0xd64, 0x956c, 0x155c,
+            0x125c, 0x792e, 0x192c, 0xfa95, 0x1a94, 0x1b4a, 0xab55, 0xad4,
+            0x14da, 0x8a5d, 0xa5a, 0x1152b, 0x152a, 0x1694, 0xd6aa, 0x15aa,
+            0xab4, 0x94ba, 0x14b6, 0xa56, 0x7527, 0xd26, 0xee53, 0xd54, 0x15aa,
+            0xa9b5, 0x96c, 0x14ae, 0x8a4e, 0x1a4c, 0x11d26, 0x1aa4, 0x1b54,
+            0xcd6a, 0xada, 0x95c, 0x949d, 0x149a, 0x1a2a, 0x5b25, 0x1aa4,
+            0xfb52, 0x16b4, 0xaba, 0xa95b, 0x936, 0x1496, 0x9a4b, 0x154a,
+            0x136a5, 0xda4, 0x15ac};
+
+    /**
+     * 将农历日期转换为公历日期
+     *
+     * @param year        农历年份
+     * @param month       农历月
+     * @param monthDay    农历日
+     * @param isLeapMonth 该月是否是闰月
+     * @return 返回农历日期对应的公历日期,year0, month1, day2.
+     */
+    public static final int[] lunarToSolar(int year, int month, int monthDay,
+                                           boolean isLeapMonth) {
+        int dayOffset;
+        int leapMonth;
+        int i;
+
+        if (year < MIN_YEAR || year > MAX_YEAR || month < 1 || month > 12
+                || monthDay < 1 || monthDay > 30) {
+            throw new IllegalArgumentException(
+                    "Illegal lunar date, must be like that:\n\t" +
+                            "year : 1900~2099\n\t" +
+                            "month : 1~12\n\t" +
+                            "day : 1~30");
+        }
+
+        dayOffset = (LUNAR_INFO[year - MIN_YEAR] & 0x001F) - 1;
+
+        if (((LUNAR_INFO[year - MIN_YEAR] & 0x0060) >> 5) == 2)
+            dayOffset += 31;
+
+        for (i = 1; i < month; i++) {
+            if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (i - 1))) == 0)
+                dayOffset += 29;
+            else
+                dayOffset += 30;
+        }
+
+        dayOffset += monthDay;
+        leapMonth = (LUNAR_INFO[year - MIN_YEAR] & 0xf00000) >> 20;
+
+        // 这一年有闰月
+        if (leapMonth != 0) {
+            if (month > leapMonth || (month == leapMonth && isLeapMonth)) {
+                if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (month - 1))) == 0)
+                    dayOffset += 29;
+                else
+                    dayOffset += 30;
+            }
+        }
+
+        if (dayOffset > 366 || (year % 4 != 0 && dayOffset > 365)) {
+            year += 1;
+            if (year % 4 == 1)
+                dayOffset -= 366;
+            else
+                dayOffset -= 365;
+        }
+
+        int[] solarInfo = new int[3];
+        for (i = 1; i < 13; i++) {
+            int iPos = DAYS_BEFORE_MONTH[i];
+            if (year % 4 == 0 && i > 2) {
+                iPos += 1;
+            }
+
+            if (year % 4 == 0 && i == 2 && iPos + 1 == dayOffset) {
+                solarInfo[1] = i;
+                solarInfo[2] = dayOffset - 31;
+                break;
+            }
+
+            if (iPos >= dayOffset) {
+                solarInfo[1] = i;
+                iPos = DAYS_BEFORE_MONTH[i - 1];
+                if (year % 4 == 0 && i > 2) {
+                    iPos += 1;
+                }
+                if (dayOffset > iPos)
+                    solarInfo[2] = dayOffset - iPos;
+                else if (dayOffset == iPos) {
+                    if (year % 4 == 0 && i == 2)
+                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1] + 1;
+                    else
+                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1];
+
+                } else
+                    solarInfo[2] = dayOffset;
+                break;
+            }
+        }
+        solarInfo[0] = year;
+
+        return solarInfo;
+    }
+
+    public static final int[] solarToLunar(int year, int month, int monthDay) {
+        int[] lunarDate = new int[4];
+
+        int index = year - solar_1_1[0];
+        int data = (year << 9) | (month << 5)
+                | (monthDay);
+        int solar11 = 0;
+        if (solar_1_1[index] > data) {
+            index--;
+        }
+        solar11 = solar_1_1[index];
+        int y = getBitInt(solar11, 12, 9);
+        int m = getBitInt(solar11, 4, 5);
+        int d = getBitInt(solar11, 5, 0);
+        long offset = solarToInt(year, month,
+                monthDay) - solarToInt(y, m, d);
+
+        int days = lunar_month_days[index];
+        int leap = getBitInt(days, 4, 13);
+
+        int lunarY = index + solar_1_1[0];
+        int lunarM = 1;
+        int lunarD = 1;
+        offset += 1;
+
+        for (int i = 0; i < 13; i++) {
+            int dm = getBitInt(days, 1, 12 - i) == 1 ? 30 : 29;
+            if (offset > dm) {
+                lunarM++;
+                offset -= dm;
+            } else {
+                break;
+            }
+        }
+        lunarD = (int) (offset);
+        lunarDate[0] = lunarY;
+        lunarDate[1] = lunarM;
+        boolean isLeap = false;
+        if (leap != 0 && lunarM > leap) {
+            lunarDate[1] = lunarM - 1;
+            if (lunarM == leap + 1) {
+                isLeap = true;
+            }
+        }
+
+        lunarDate[2] = lunarD;
+        lunarDate[3] = isLeap ? 1 : 0;
+        //Log.i("----------->",year+"-"+month+"-"+monthDay+"====>"+lunarDate[0]+"-"+lunarDate[1]+"-"+lunarDate[2]+"-"+lunarDate[3]);
+        return lunarDate;
+    }
+
+
+    /**
+     * 将公历日期转换为农历日期,且标识是否是闰月
+     *
+     * @param year
+     * @param month
+     * @param monthDay
+     * @return 返回公历日期对应的农历日期,year0,month1,day2,leap3
+     * @deprecated 不准确
+     */
+    @Deprecated
+    public static final int[] solarToLunarDeprecated(int year, int month, int monthDay) {
+        int[] lunarDate = new int[4];
+        Date baseDate = new GregorianCalendar(1900, 0, 31).getTime();
+        Date objDate = new GregorianCalendar(year, month - 1, monthDay).getTime();
+        int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000L);
+
+        // 用offset减去每农历年的天数计算当天是农历第几天
+        // iYear最终结果是农历的年份, offset是当年的第几天
+        int iYear, daysOfYear = 0;
+        for (iYear = MIN_YEAR; iYear <= MAX_YEAR && offset > 0; iYear++) {
+            daysOfYear = daysInLunarYear(iYear);
+            offset -= daysOfYear;
+        }
+        if (offset < 0) {
+            offset += daysOfYear;
+            iYear--;
+        }
+
+        // 农历年份
+        lunarDate[0] = iYear;
+
+        int leapMonth = leapMonth(iYear); // 闰哪个月,1-12
+        boolean isLeap = false;
+        // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
+        int iMonth, daysOfMonth = 0;
+        for (iMonth = 1; iMonth <= 13 && offset > 0; iMonth++) {
+            daysOfMonth = daysInLunarMonth(iYear, iMonth);
+            offset -= daysOfMonth;
+        }
+        // 当前月超过闰月,要校正
+        if (leapMonth != 0 && iMonth > leapMonth) {
+            --iMonth;
+            Log.i("----------->", year + "-" + month + "-" + monthDay + "====>" + iMonth + "-" + leapMonth);
+            if (iMonth == leapMonth) {
+                isLeap = true;
+            }
+        }
+        // offset小于0时,也要校正
+        if (offset < 0) {
+            offset += daysOfMonth;
+            --iMonth;
+        }
+
+        lunarDate[1] = iMonth;
+        lunarDate[2] = offset + 1;
+        lunarDate[3] = isLeap ? 1 : 0;
+
+        //Log.i("----------->",year+"-"+month+"-"+monthDay+"====>"+lunarDate[0]+"-"+lunarDate[1]+"-"+lunarDate[2]+"-"+lunarDate[3]);
+        return lunarDate;
+    }
+
+    /**
+     * 传回农历year年month月的总天数
+     *
+     * @param year  要计算的年份
+     * @param month 要计算的月
+     * @return 传回天数
+     */
+    final public static int daysInMonth(int year, int month) {
+        return daysInMonth(year, month, false);
+    }
+
+    /**
+     * 传回农历year年month月的总天数
+     *
+     * @param year  要计算的年份
+     * @param month 要计算的月
+     * @param leap  当月是否是闰月
+     * @return 传回天数,如果闰月是错误的,返回0.
+     */
+    public static final int daysInMonth(int year, int month, boolean leap) {
+        int leapMonth = leapMonth(year);
+        int offset = 0;
+
+        // 如果本年有闰月且month大于闰月时,需要校正
+        if (leapMonth != 0 && month > leapMonth) {
+            offset = 1;
+        }
+
+        // 不考虑闰月
+        if (!leap) {
+            return daysInLunarMonth(year, month + offset);
+        } else {
+            // 传入的闰月是正确的月份
+            if (leapMonth != 0 && leapMonth == month) {
+                return daysInLunarMonth(year, month + 1);
+            }
+        }
+
+        return 0;
+    }
+
+    /**
+     * 传回农历 year年的总天数
+     *
+     * @param year 将要计算的年份
+     * @return 返回传入年份的总天数
+     */
+    private static int daysInLunarYear(int year) {
+        int i, sum = 348;
+        if (leapMonth(year) != 0) {
+            sum = 377;
+        }
+        int monthInfo = LUNAR_INFO[year - MIN_YEAR] & 0x0FFF80;
+        for (i = 0x80000; i > 0x7; i >>= 1) {
+            if ((monthInfo & i) != 0)
+                sum += 1;
+        }
+        return sum;
+    }
+
+    /**
+     * 传回农历 year年month月的总天数,总共有13个月包括闰月
+     *
+     * @param year  将要计算的年份
+     * @param month 将要计算的月份
+     * @return 传回农历 year年month月的总天数
+     */
+    private static int daysInLunarMonth(int year, int month) {
+        if ((LUNAR_INFO[year - MIN_YEAR] & (0x100000 >> month)) == 0)
+            return 29;
+        else
+            return 30;
+    }
+
+    /**
+     * 传回农历 year年闰哪个月 1-12 , 没闰传回 0
+     *
+     * @param year 将要计算的年份
+     * @return 传回农历 year年闰哪个月1-12, 没闰传回 0
+     */
+    public static int leapMonth(int year) {
+        return (int) ((LUNAR_INFO[year - MIN_YEAR] & 0xF00000)) >> 20;
+    }
+
+
+    private static int getBitInt(int data, int length, int shift) {
+        return (data & (((1 << length) - 1) << shift)) >> shift;
+    }
+
+    private static long solarToInt(int y, int m, int d) {
+        m = (m + 9) % 12;
+        y = y - m / 10;
+        return 365 * y + y / 4 - y / 100 + y / 400 + (m * 306 + 5) / 10
+                + (d - 1);
+    }
+
+}

+ 26 - 0
pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java

@@ -0,0 +1,26 @@
+package com.bigkoo.pickerview.utils;
+
+import android.view.Gravity;
+
+import com.bigkoo.pickerview.R;
+
+/**
+ * Created by Sai on 15/8/9.
+ */
+public class PickerViewAnimateUtil {
+    private static final int INVALID = -1;
+    /**
+     * Get default animation resource when not defined by the user
+     *
+     * @param gravity       the animGravity of the dialog
+     * @param isInAnimation determine if is in or out animation. true when is is
+     * @return the id of the animation resource
+     */
+    public static int getAnimationResource(int gravity, boolean isInAnimation) {
+        switch (gravity) {
+            case Gravity.BOTTOM:
+                return isInAnimation ? R.anim.pickerview_slide_in_bottom : R.anim.pickerview_slide_out_bottom;
+        }
+        return INVALID;
+    }
+}

+ 373 - 0
pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java

@@ -0,0 +1,373 @@
+package com.bigkoo.pickerview.view;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.graphics.Color;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.widget.FrameLayout;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.configure.PickerOptions;
+import com.bigkoo.pickerview.listener.OnDismissListener;
+import com.bigkoo.pickerview.utils.PickerViewAnimateUtil;
+
+/**
+ * Created by Sai on 15/11/22.
+ * 精仿iOSPickerViewController控件
+ */
+public class BasePickerView {
+
+    private Context context;
+    protected ViewGroup contentContainer;
+    private ViewGroup rootView;//附加View 的 根View
+    private ViewGroup dialogView;//附加Dialog 的 根View
+
+    protected PickerOptions mPickerOptions;
+    private OnDismissListener onDismissListener;
+    private boolean dismissing;
+
+    private Animation outAnim;
+    private Animation inAnim;
+    private boolean isShowing;
+
+    protected int animGravity = Gravity.BOTTOM;
+
+    private Dialog mDialog;
+    protected View clickView;//是通过哪个View弹出的
+    private boolean isAnim = true;
+
+    public BasePickerView(Context context) {
+        this.context = context;
+    }
+
+
+    protected void initViews() {
+
+        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);
+
+        LayoutInflater layoutInflater = LayoutInflater.from(context);
+        if (isDialog()) {
+            //如果是对话框模式
+            dialogView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, null, false);
+            //设置界面的背景为透明
+            dialogView.setBackgroundColor(Color.TRANSPARENT);
+            //这个是真正要加载选择器的父布局
+            contentContainer = (ViewGroup) dialogView.findViewById(R.id.content_container);
+            //设置对话框 默认左右间距屏幕30
+            params.leftMargin = 30;
+            params.rightMargin = 30;
+            contentContainer.setLayoutParams(params);
+            //创建对话框
+            createDialog();
+            //给背景设置点击事件,这样当点击内容以外的地方会关闭界面
+            dialogView.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View view) {
+                    dismiss();
+                }
+            });
+        } else {
+            //如果只是要显示在屏幕的下方
+            //decorView是activity的根View,包含 contentView 和 titleView
+            if (mPickerOptions.decorView == null) {
+                mPickerOptions.decorView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
+            }
+            //将控件添加到decorView中
+            rootView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, mPickerOptions.decorView, false);
+            rootView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
+            if (mPickerOptions.outSideColor != -1) {
+                rootView.setBackgroundColor(mPickerOptions.outSideColor);
+            }
+            //这个是真正要加载时间选取器的父布局
+            contentContainer = (ViewGroup) rootView.findViewById(R.id.content_container);
+            contentContainer.setLayoutParams(params);
+        }
+        setKeyBackCancelable(true);
+    }
+
+    protected void initAnim() {
+        inAnim = getInAnimation();
+        outAnim = getOutAnimation();
+    }
+
+    protected void initEvents() {
+    }
+
+
+    /**
+     * @param v      (是通过哪个View弹出的)
+     * @param isAnim 是否显示动画效果
+     */
+    public void show(View v, boolean isAnim) {
+        this.clickView = v;
+        this.isAnim = isAnim;
+        show();
+    }
+
+    public void show(boolean isAnim) {
+        show(null, isAnim);
+    }
+
+    public void show(View v) {
+        this.clickView = v;
+        show();
+    }
+
+
+    /**
+     * 添加View到根视图
+     */
+    public void show() {
+        if (isDialog()) {
+            showDialog();
+        } else {
+            if (isShowing()) {
+                return;
+            }
+            isShowing = true;
+            onAttached(rootView);
+            rootView.requestFocus();
+        }
+    }
+
+
+    /**
+     * show的时候调用
+     *
+     * @param view 这个View
+     */
+    private void onAttached(View view) {
+        mPickerOptions.decorView.addView(view);
+        if (onDismissListener != null) {
+            onDismissListener.onShow();
+        }
+        if (isAnim) {
+            contentContainer.startAnimation(inAnim);
+        }
+    }
+
+
+    /**
+     * 检测该View是不是已经添加到根视图
+     *
+     * @return 如果视图已经存在该View返回true
+     */
+    public boolean isShowing() {
+        if (isDialog()) {
+            return false;
+        } else {
+            return rootView.getParent() != null || isShowing;
+        }
+
+    }
+
+    public void dismiss() {
+        if (isDialog()) {
+            dismissDialog();
+        } else {
+            if (dismissing) {
+                return;
+            }
+
+            if (isAnim) {
+                //消失动画
+                outAnim.setAnimationListener(new Animation.AnimationListener() {
+                    @Override
+                    public void onAnimationStart(Animation animation) {
+
+                    }
+
+                    @Override
+                    public void onAnimationEnd(Animation animation) {
+                        dismissImmediately();
+                    }
+
+                    @Override
+                    public void onAnimationRepeat(Animation animation) {
+
+                    }
+                });
+                contentContainer.startAnimation(outAnim);
+            } else {
+                dismissImmediately();
+            }
+            dismissing = true;
+        }
+
+
+    }
+
+    public void dismissImmediately() {
+
+        mPickerOptions.decorView.post(new Runnable() {
+            @Override
+            public void run() {
+                //从根视图移除
+                mPickerOptions.decorView.removeView(rootView);
+                isShowing = false;
+                dismissing = false;
+                if (onDismissListener != null) {
+                    onDismissListener.onDismiss(BasePickerView.this);
+                }
+            }
+        });
+
+
+    }
+
+    private Animation getInAnimation() {
+        int res = PickerViewAnimateUtil.getAnimationResource(this.animGravity, true);
+        return AnimationUtils.loadAnimation(context, res);
+    }
+
+    private Animation getOutAnimation() {
+        int res = PickerViewAnimateUtil.getAnimationResource(this.animGravity, false);
+        return AnimationUtils.loadAnimation(context, res);
+    }
+
+    public BasePickerView setOnDismissListener(OnDismissListener onDismissListener) {
+        this.onDismissListener = onDismissListener;
+        return this;
+    }
+
+    public void setKeyBackCancelable(boolean isCancelable) {
+
+        ViewGroup View;
+        if (isDialog()) {
+            View = dialogView;
+        } else {
+            View = rootView;
+        }
+
+        View.setFocusable(isCancelable);
+        View.setFocusableInTouchMode(isCancelable);
+        if (isCancelable) {
+            View.setOnKeyListener(onKeyBackListener);
+        } else {
+            View.setOnKeyListener(null);
+        }
+    }
+
+    private View.OnKeyListener onKeyBackListener = new View.OnKeyListener() {
+        @Override
+        public boolean onKey(View v, int keyCode, KeyEvent event) {
+            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_DOWN && isShowing()) {
+                dismiss();
+                return true;
+            }
+            return false;
+        }
+    };
+
+    protected BasePickerView setOutSideCancelable(boolean isCancelable) {
+
+        if (rootView != null) {
+            View view = rootView.findViewById(R.id.outmost_container);
+
+            if (isCancelable) {
+                view.setOnTouchListener(onCancelableTouchListener);
+            } else {
+                view.setOnTouchListener(null);
+            }
+        }
+
+        return this;
+    }
+
+    /**
+     * 设置对话框模式是否可以点击外部取消
+     */
+    public void setDialogOutSideCancelable() {
+        if (mDialog != null) {
+            mDialog.setCancelable(mPickerOptions.cancelable);
+        }
+    }
+
+
+    /**
+     * Called when the user touch on black overlay, in order to dismiss the dialog.
+     */
+    private final View.OnTouchListener onCancelableTouchListener = new View.OnTouchListener() {
+        @Override
+        public boolean onTouch(View v, MotionEvent event) {
+            if (event.getAction() == MotionEvent.ACTION_DOWN) {
+                dismiss();
+            }
+            return false;
+        }
+    };
+
+    public View findViewById(int id) {
+        return contentContainer.findViewById(id);
+    }
+
+    public void createDialog() {
+        if (dialogView != null) {
+            mDialog = new Dialog(context, R.style.custom_dialog2);
+            mDialog.setCancelable(mPickerOptions.cancelable);//不能点外面取消,也不能点back取消
+            mDialog.setContentView(dialogView);
+
+            Window dialogWindow = mDialog.getWindow();
+            if (dialogWindow != null) {
+                dialogWindow.setWindowAnimations(R.style.picker_view_scale_anim);
+                dialogWindow.setGravity(Gravity.CENTER);//可以改成Bottom
+            }
+
+            mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+                @Override
+                public void onDismiss(DialogInterface dialog) {
+                    if (onDismissListener != null) {
+                        onDismissListener.onDismiss(BasePickerView.this);
+                    }
+                }
+            });
+
+            mDialog.setOnShowListener(new DialogInterface.OnShowListener() {
+                @Override
+                public void onShow(DialogInterface dialog) {
+                    if (onDismissListener != null) {
+                        onDismissListener.onShow();
+                    }
+                }
+            });
+        }
+    }
+
+    private void showDialog() {
+        if (mDialog != null) {
+            mDialog.show();
+        }
+    }
+
+    private void dismissDialog() {
+        if (mDialog != null) {
+            mDialog.dismiss();
+        }
+    }
+
+    public ViewGroup getDialogContainerLayout() {
+        return contentContainer;
+    }
+
+
+    public Dialog getDialog() {
+        return mDialog;
+    }
+
+
+    public boolean isDialog() {
+        return false;
+    }
+
+}

+ 204 - 0
pickerview/src/main/java/com/bigkoo/pickerview/view/OptionsPickerView.java

@@ -0,0 +1,204 @@
+package com.bigkoo.pickerview.view;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.configure.PickerOptions;
+
+import java.util.List;
+
+/**
+ * 条件选择器
+ * Created by Sai on 15/11/22.
+ */
+public class OptionsPickerView<T> extends BasePickerView implements View.OnClickListener {
+
+    private WheelOptions<T> wheelOptions;
+
+    private static final String TAG_SUBMIT = "submit";
+    private static final String TAG_CANCEL = "cancel";
+
+
+    public OptionsPickerView(PickerOptions pickerOptions) {
+        super(pickerOptions.context);
+        mPickerOptions = pickerOptions;
+        initView(pickerOptions.context);
+    }
+
+    private void initView(Context context) {
+        setDialogOutSideCancelable();
+        initViews();
+        initAnim();
+        initEvents();
+        if (mPickerOptions.customListener == null && mPickerOptions.customListener2 == null) {
+            LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer);
+
+            //顶部标题
+            TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
+            RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar);
+
+            //确定和取消按钮
+            Button btnSubmit = (Button) findViewById(R.id.btnSubmit);
+            Button btnCancel = (Button) findViewById(R.id.btnCancel);
+
+            btnSubmit.setTag(TAG_SUBMIT);
+            btnCancel.setTag(TAG_CANCEL);
+            btnSubmit.setOnClickListener(this);
+            btnCancel.setOnClickListener(this);
+
+            //设置文字
+            btnSubmit.setText(TextUtils.isEmpty(mPickerOptions.textContentConfirm) ? context.getResources().getString(R.string.pickerview_submit) : mPickerOptions.textContentConfirm);
+            btnCancel.setText(TextUtils.isEmpty(mPickerOptions.textContentCancel) ? context.getResources().getString(R.string.pickerview_cancel) : mPickerOptions.textContentCancel);
+            tvTitle.setText(TextUtils.isEmpty(mPickerOptions.textContentTitle) ? "" : mPickerOptions.textContentTitle);//默认为空
+
+            //设置color
+            btnSubmit.setTextColor(mPickerOptions.textColorConfirm);
+            btnCancel.setTextColor(mPickerOptions.textColorCancel);
+            tvTitle.setTextColor(mPickerOptions.textColorTitle);
+            rv_top_bar.setBackgroundColor(mPickerOptions.bgColorTitle);
+
+            //设置文字大小
+            btnSubmit.setTextSize(mPickerOptions.textSizeSubmitCancel);
+            btnCancel.setTextSize(mPickerOptions.textSizeSubmitCancel);
+            tvTitle.setTextSize(mPickerOptions.textSizeTitle);
+        } else {
+            if (mPickerOptions.customListener != null) {
+                mPickerOptions.customListener.customLayout(LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer));
+            }
+            if (mPickerOptions.customListener2 != null) {
+                mPickerOptions.customListener2.customLayout(this,LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer));
+            }
+        }
+
+        // ----滚轮布局
+        final LinearLayout optionsPicker = (LinearLayout) findViewById(R.id.optionspicker);
+        optionsPicker.setBackgroundColor(mPickerOptions.bgColorWheel);
+
+        wheelOptions = new WheelOptions<>(optionsPicker, mPickerOptions.isRestoreItem);
+        if (mPickerOptions.optionsSelectChangeListener != null) {
+            wheelOptions.setOptionsSelectChangeListener(mPickerOptions.optionsSelectChangeListener);
+        }
+
+        wheelOptions.setTextContentSize(mPickerOptions.textSizeContent);
+        wheelOptions.setItemsVisible(mPickerOptions.itemsVisibleCount);
+        wheelOptions.setAlphaGradient(mPickerOptions.isAlphaGradient);
+        wheelOptions.setLabels(mPickerOptions.label1, mPickerOptions.label2, mPickerOptions.label3);
+        wheelOptions.setTextXOffset(mPickerOptions.x_offset_one, mPickerOptions.x_offset_two, mPickerOptions.x_offset_three);
+        wheelOptions.setCyclic(mPickerOptions.cyclic1, mPickerOptions.cyclic2, mPickerOptions.cyclic3);
+        wheelOptions.setTypeface(mPickerOptions.font);
+
+        setOutSideCancelable(mPickerOptions.cancelable);
+
+        wheelOptions.setDividerColor(mPickerOptions.dividerColor);
+        wheelOptions.setDividerPadding(mPickerOptions.dividerPadding);
+        wheelOptions.setDividerType(mPickerOptions.dividerType);
+        wheelOptions.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier);
+        wheelOptions.setTextColorOut(mPickerOptions.textColorOut);
+        wheelOptions.setTextColorCenter(mPickerOptions.textColorCenter);
+        wheelOptions.isCenterLabel(mPickerOptions.isCenterLabel);
+
+    }
+
+    /**
+     * 动态设置标题
+     *
+     * @param text 标题文本内容
+     */
+    public void setTitleText(String text) {
+        TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
+        if (tvTitle != null) {
+            tvTitle.setText(text);
+        }
+    }
+
+    /**
+     * 设置默认选中项
+     *
+     * @param option1
+     */
+    public void setSelectOptions(int option1) {
+        mPickerOptions.option1 = option1;
+        reSetCurrentItems();
+    }
+
+
+    public void setSelectOptions(int option1, int option2) {
+        mPickerOptions.option1 = option1;
+        mPickerOptions.option2 = option2;
+        reSetCurrentItems();
+    }
+
+    public void setSelectOptions(int option1, int option2, int option3) {
+        mPickerOptions.option1 = option1;
+        mPickerOptions.option2 = option2;
+        mPickerOptions.option3 = option3;
+        reSetCurrentItems();
+    }
+
+    private void reSetCurrentItems() {
+        if (wheelOptions != null) {
+            wheelOptions.setCurrentItems(mPickerOptions.option1, mPickerOptions.option2, mPickerOptions.option3);
+        }
+    }
+
+    public void setPicker(List<T> optionsItems) {
+        this.setPicker(optionsItems, null, null);
+    }
+
+    public void setPicker(List<T> options1Items, List<List<T>> options2Items) {
+        this.setPicker(options1Items, options2Items, null);
+    }
+
+    public void setPicker(List<T> options1Items,
+                          List<List<T>> options2Items,
+                          List<List<List<T>>> options3Items) {
+
+        wheelOptions.setPicker(options1Items, options2Items, options3Items);
+        reSetCurrentItems();
+    }
+
+
+    //不联动情况下调用
+    public void setNPicker(List<T> options1Items,
+                           List<T> options2Items,
+                           List<T> options3Items) {
+
+        wheelOptions.setLinkage(false);
+        wheelOptions.setNPicker(options1Items, options2Items, options3Items);
+        reSetCurrentItems();
+    }
+
+    @Override
+    public void onClick(View v) {
+        String tag = (String) v.getTag();
+        if (tag.equals(TAG_SUBMIT)) {
+            returnData();
+        } else if (tag.equals(TAG_CANCEL)) {
+            if (mPickerOptions.cancelListener != null) {
+                mPickerOptions.cancelListener.onClick(v);
+            }
+        }
+        dismiss();
+    }
+
+    //抽离接口回调的方法
+    public void returnData() {
+        if (mPickerOptions.optionsSelectListener != null) {
+            int[] optionsCurrentItems = wheelOptions.getCurrentItems();
+            mPickerOptions.optionsSelectListener.onOptionsSelect(optionsCurrentItems[0], optionsCurrentItems[1], optionsCurrentItems[2], clickView);
+        }
+    }
+
+
+    @Override
+    public boolean isDialog() {
+        return mPickerOptions.isDialog;
+    }
+}

+ 290 - 0
pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java

@@ -0,0 +1,290 @@
+package com.bigkoo.pickerview.view;
+
+import android.content.Context;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.configure.PickerOptions;
+import com.bigkoo.pickerview.listener.ISelectTimeCallback;
+
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 时间选择器
+ * Created by Sai on 15/11/22.
+ * Updated by XiaoSong on 2017-2-22.
+ */
+public class TimePickerView extends BasePickerView implements View.OnClickListener {
+
+    private WheelTime wheelTime; //自定义控件
+    private static final String TAG_SUBMIT = "submit";
+    private static final String TAG_CANCEL = "cancel";
+
+    public TimePickerView(PickerOptions pickerOptions) {
+        super(pickerOptions.context);
+        mPickerOptions = pickerOptions;
+        initView(pickerOptions.context);
+    }
+
+    private void initView(Context context) {
+        setDialogOutSideCancelable();
+        initViews();
+        initAnim();
+
+        if (mPickerOptions.customListener == null) {
+            LayoutInflater.from(context).inflate(R.layout.pickerview_time, contentContainer);
+
+            //顶部标题
+            TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
+            RelativeLayout rv_top_bar = (RelativeLayout) findViewById(R.id.rv_topbar);
+
+            //确定和取消按钮
+            Button btnSubmit = (Button) findViewById(R.id.btnSubmit);
+            Button btnCancel = (Button) findViewById(R.id.btnCancel);
+
+            btnSubmit.setTag(TAG_SUBMIT);
+            btnCancel.setTag(TAG_CANCEL);
+
+            btnSubmit.setOnClickListener(this);
+            btnCancel.setOnClickListener(this);
+
+            //设置文字
+            btnSubmit.setText(TextUtils.isEmpty(mPickerOptions.textContentConfirm) ? context.getResources().getString(R.string.pickerview_submit) : mPickerOptions.textContentConfirm);
+            btnCancel.setText(TextUtils.isEmpty(mPickerOptions.textContentCancel) ? context.getResources().getString(R.string.pickerview_cancel) : mPickerOptions.textContentCancel);
+            tvTitle.setText(TextUtils.isEmpty(mPickerOptions.textContentTitle) ? "" : mPickerOptions.textContentTitle);//默认为空
+
+            //设置color
+            btnSubmit.setTextColor(mPickerOptions.textColorConfirm);
+            btnCancel.setTextColor(mPickerOptions.textColorCancel);
+            tvTitle.setTextColor(mPickerOptions.textColorTitle);
+            rv_top_bar.setBackgroundColor(mPickerOptions.bgColorTitle);
+
+            //设置文字大小
+            btnSubmit.setTextSize(mPickerOptions.textSizeSubmitCancel);
+            btnCancel.setTextSize(mPickerOptions.textSizeSubmitCancel);
+            tvTitle.setTextSize(mPickerOptions.textSizeTitle);
+
+        } else {
+            mPickerOptions.customListener.customLayout(LayoutInflater.from(context).inflate(mPickerOptions.layoutRes, contentContainer));
+        }
+        // 时间转轮 自定义控件
+        LinearLayout timePickerView = (LinearLayout) findViewById(R.id.timepicker);
+        timePickerView.setBackgroundColor(mPickerOptions.bgColorWheel);
+
+        initWheelTime(timePickerView);
+    }
+
+    private void initWheelTime(LinearLayout timePickerView) {
+        wheelTime = new WheelTime(timePickerView, mPickerOptions.type, mPickerOptions.textGravity, mPickerOptions.textSizeContent);
+        if (mPickerOptions.timeSelectChangeListener != null) {
+            wheelTime.setSelectChangeCallback(new ISelectTimeCallback() {
+                @Override
+                public void onTimeSelectChanged() {
+                    try {
+                        Date date = WheelTime.dateFormat.parse(wheelTime.getTime());
+                        mPickerOptions.timeSelectChangeListener.onTimeSelectChanged(date);
+                    } catch (ParseException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        }
+
+        wheelTime.setLunarMode(mPickerOptions.isLunarCalendar);
+
+        if (mPickerOptions.startYear != 0 && mPickerOptions.endYear != 0
+                && mPickerOptions.startYear <= mPickerOptions.endYear) {
+            setRange();
+        }
+
+        //若手动设置了时间范围限制
+        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {
+            if (mPickerOptions.startDate.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) {
+                throw new IllegalArgumentException("startDate can't be later than endDate");
+            } else {
+                setRangDate();
+            }
+        } else if (mPickerOptions.startDate != null) {
+            if (mPickerOptions.startDate.get(Calendar.YEAR) < 1900) {
+                throw new IllegalArgumentException("The startDate can not as early as 1900");
+            } else {
+                setRangDate();
+            }
+        } else if (mPickerOptions.endDate != null) {
+            if (mPickerOptions.endDate.get(Calendar.YEAR) > 2100) {
+                throw new IllegalArgumentException("The endDate should not be later than 2100");
+            } else {
+                setRangDate();
+            }
+        } else {//没有设置时间范围限制,则会使用默认范围。
+            setRangDate();
+        }
+
+        setTime();
+        wheelTime.setLabels(mPickerOptions.label_year, mPickerOptions.label_month, mPickerOptions.label_day
+                , mPickerOptions.label_hours, mPickerOptions.label_minutes, mPickerOptions.label_seconds);
+        wheelTime.setTextXOffset(mPickerOptions.x_offset_year, mPickerOptions.x_offset_month, mPickerOptions.x_offset_day,
+                mPickerOptions.x_offset_hours, mPickerOptions.x_offset_minutes, mPickerOptions.x_offset_seconds);
+        wheelTime.setItemsVisible(mPickerOptions.itemsVisibleCount);
+        wheelTime.setAlphaGradient(mPickerOptions.isAlphaGradient);
+        setOutSideCancelable(mPickerOptions.cancelable);
+        wheelTime.setCyclic(mPickerOptions.cyclic);
+        wheelTime.setDividerColor(mPickerOptions.dividerColor);
+        wheelTime.setDividerPadding(mPickerOptions.dividerPadding);
+        wheelTime.setDividerType(mPickerOptions.dividerType);
+        wheelTime.setLineSpacingMultiplier(mPickerOptions.lineSpacingMultiplier);
+        wheelTime.setTextColorOut(mPickerOptions.textColorOut);
+        wheelTime.setTextColorCenter(mPickerOptions.textColorCenter);
+        wheelTime.isCenterLabel(mPickerOptions.isCenterLabel);
+    }
+
+
+    /**
+     * 设置默认时间
+     */
+    public void setDate(Calendar date) {
+        mPickerOptions.date = date;
+        setTime();
+    }
+
+    /**
+     * 设置可以选择的时间范围, 要在setTime之前调用才有效果
+     */
+    private void setRange() {
+        wheelTime.setStartYear(mPickerOptions.startYear);
+        wheelTime.setEndYear(mPickerOptions.endYear);
+
+    }
+
+    /**
+     * 设置可以选择的时间范围, 要在setTime之前调用才有效果
+     */
+    private void setRangDate() {
+        wheelTime.setRangDate(mPickerOptions.startDate, mPickerOptions.endDate);
+        initDefaultSelectedDate();
+    }
+
+    private void initDefaultSelectedDate() {
+        //如果手动设置了时间范围
+        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {
+            //若默认时间未设置,或者设置的默认时间越界了,则设置默认选中时间为开始时间。
+            if (mPickerOptions.date == null || mPickerOptions.date.getTimeInMillis() < mPickerOptions.startDate.getTimeInMillis()
+                    || mPickerOptions.date.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) {
+                mPickerOptions.date = mPickerOptions.startDate;
+            }
+        } else if (mPickerOptions.startDate != null) {
+            //没有设置默认选中时间,那就拿开始时间当默认时间
+            mPickerOptions.date = mPickerOptions.startDate;
+        } else if (mPickerOptions.endDate != null) {
+            mPickerOptions.date = mPickerOptions.endDate;
+        }
+    }
+
+    /**
+     * 设置选中时间,默认选中当前时间
+     */
+    private void setTime() {
+        int year, month, day, hours, minute, seconds;
+        Calendar calendar = Calendar.getInstance();
+
+        if (mPickerOptions.date == null) {
+            calendar.setTimeInMillis(System.currentTimeMillis());
+            year = calendar.get(Calendar.YEAR);
+            month = calendar.get(Calendar.MONTH);
+            day = calendar.get(Calendar.DAY_OF_MONTH);
+            hours = calendar.get(Calendar.HOUR_OF_DAY);
+            minute = calendar.get(Calendar.MINUTE);
+            seconds = calendar.get(Calendar.SECOND);
+        } else {
+            year = mPickerOptions.date.get(Calendar.YEAR);
+            month = mPickerOptions.date.get(Calendar.MONTH);
+            day = mPickerOptions.date.get(Calendar.DAY_OF_MONTH);
+            hours = mPickerOptions.date.get(Calendar.HOUR_OF_DAY);
+            minute = mPickerOptions.date.get(Calendar.MINUTE);
+            seconds = mPickerOptions.date.get(Calendar.SECOND);
+        }
+
+        wheelTime.setPicker(year, month, day, hours, minute, seconds);
+    }
+
+
+    @Override
+    public void onClick(View v) {
+        String tag = (String) v.getTag();
+        if (tag.equals(TAG_SUBMIT)) {
+            returnData();
+        } else if (tag.equals(TAG_CANCEL)) {
+            if (mPickerOptions.cancelListener != null) {
+                mPickerOptions.cancelListener.onClick(v);
+            }
+        }
+        dismiss();
+    }
+
+    public void returnData() {
+        if (mPickerOptions.timeSelectListener != null) {
+            try {
+                Date date = WheelTime.dateFormat.parse(wheelTime.getTime());
+                mPickerOptions.timeSelectListener.onTimeSelect(date, clickView);
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 动态设置标题
+     *
+     * @param text 标题文本内容
+     */
+    public void setTitleText(String text) {
+        TextView tvTitle = (TextView) findViewById(R.id.tvTitle);
+        if (tvTitle != null) {
+            tvTitle.setText(text);
+        }
+    }
+
+    /**
+     * 目前暂时只支持设置1900 - 2100年
+     *
+     * @param lunar 农历的开关
+     */
+    public void setLunarCalendar(boolean lunar) {
+        try {
+            int year, month, day, hours, minute, seconds;
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(WheelTime.dateFormat.parse(wheelTime.getTime()));
+            year = calendar.get(Calendar.YEAR);
+            month = calendar.get(Calendar.MONTH);
+            day = calendar.get(Calendar.DAY_OF_MONTH);
+            hours = calendar.get(Calendar.HOUR_OF_DAY);
+            minute = calendar.get(Calendar.MINUTE);
+            seconds = calendar.get(Calendar.SECOND);
+
+            wheelTime.setLunarMode(lunar);
+            wheelTime.setLabels(mPickerOptions.label_year, mPickerOptions.label_month, mPickerOptions.label_day,
+                    mPickerOptions.label_hours, mPickerOptions.label_minutes, mPickerOptions.label_seconds);
+            wheelTime.setPicker(year, month, day, hours, minute, seconds);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public boolean isLunarCalendar() {
+        return wheelTime.isLunarMode();
+    }
+
+
+    @Override
+    public boolean isDialog() {
+        return mPickerOptions.isDialog;
+    }
+}

+ 440 - 0
pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java

@@ -0,0 +1,440 @@
+package com.bigkoo.pickerview.view;
+
+import android.graphics.Typeface;
+import android.view.View;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.adapter.ArrayWheelAdapter;
+import com.bigkoo.pickerview.listener.OnOptionsSelectChangeListener;
+import com.contrarywind.listener.OnItemSelectedListener;
+import com.contrarywind.view.WheelView;
+
+import java.util.List;
+
+public class WheelOptions<T> {
+    private View view;
+    private WheelView wv_option1;
+    private WheelView wv_option2;
+    private WheelView wv_option3;
+
+    private List<T> mOptions1Items;
+    private List<List<T>> mOptions2Items;
+    private List<List<List<T>>> mOptions3Items;
+
+    private boolean linkage = true;//默认联动
+    private boolean isRestoreItem; //切换时,还原第一项
+    private OnItemSelectedListener wheelListener_option1;
+    private OnItemSelectedListener wheelListener_option2;
+
+    private OnOptionsSelectChangeListener optionsSelectChangeListener;
+
+    public View getView() {
+        return view;
+    }
+
+    public void setView(View view) {
+        this.view = view;
+    }
+
+    public WheelOptions(View view, boolean isRestoreItem) {
+        super();
+        this.isRestoreItem = isRestoreItem;
+        this.view = view;
+        wv_option1 = (WheelView) view.findViewById(R.id.options1);// 初始化时显示的数据
+        wv_option2 = (WheelView) view.findViewById(R.id.options2);
+        wv_option3 = (WheelView) view.findViewById(R.id.options3);
+    }
+
+
+    public void setPicker(List<T> options1Items,
+                          List<List<T>> options2Items,
+                          List<List<List<T>>> options3Items) {
+        this.mOptions1Items = options1Items;
+        this.mOptions2Items = options2Items;
+        this.mOptions3Items = options3Items;
+
+        // 选项1
+        wv_option1.setAdapter(new ArrayWheelAdapter(mOptions1Items));// 设置显示数据
+        wv_option1.setCurrentItem(0);// 初始化时显示的数据
+        // 选项2
+        if (mOptions2Items != null) {
+            wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(0)));// 设置显示数据
+        }
+        wv_option2.setCurrentItem(wv_option2.getCurrentItem());// 初始化时显示的数据
+        // 选项3
+        if (mOptions3Items != null) {
+            wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(0).get(0)));// 设置显示数据
+        }
+        wv_option3.setCurrentItem(wv_option3.getCurrentItem());
+        wv_option1.setIsOptions(true);
+        wv_option2.setIsOptions(true);
+        wv_option3.setIsOptions(true);
+
+        if (this.mOptions2Items == null) {
+            wv_option2.setVisibility(View.GONE);
+        } else {
+            wv_option2.setVisibility(View.VISIBLE);
+        }
+        if (this.mOptions3Items == null) {
+            wv_option3.setVisibility(View.GONE);
+        } else {
+            wv_option3.setVisibility(View.VISIBLE);
+        }
+
+        // 联动监听器
+        wheelListener_option1 = new OnItemSelectedListener() {
+
+            @Override
+            public void onItemSelected(int index) {
+                int opt2Select = 0;
+                if (mOptions2Items == null) {//只有1级联动数据
+                    if (optionsSelectChangeListener != null) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), 0, 0);
+                    }
+                } else {
+                    if (!isRestoreItem) {
+                        opt2Select = wv_option2.getCurrentItem();//上一个opt2的选中位置
+                        //新opt2的位置,判断如果旧位置没有超过数据范围,则沿用旧位置,否则选中最后一项
+                        opt2Select = opt2Select >= mOptions2Items.get(index).size() - 1 ? mOptions2Items.get(index).size() - 1 : opt2Select;
+                    }
+                    wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(index)));
+                    wv_option2.setCurrentItem(opt2Select);
+
+                    if (mOptions3Items != null) {
+                        wheelListener_option2.onItemSelected(opt2Select);
+                    } else {//只有2级联动数据,滑动第1项回调
+                        if (optionsSelectChangeListener != null) {
+                            optionsSelectChangeListener.onOptionsSelectChanged(index, opt2Select, 0);
+                        }
+                    }
+                }
+            }
+        };
+
+        wheelListener_option2 = new OnItemSelectedListener() {
+
+            @Override
+            public void onItemSelected(int index) {
+                if (mOptions3Items != null) {
+                    int opt1Select = wv_option1.getCurrentItem();
+                    opt1Select = opt1Select >= mOptions3Items.size() - 1 ? mOptions3Items.size() - 1 : opt1Select;
+                    index = index >= mOptions2Items.get(opt1Select).size() - 1 ? mOptions2Items.get(opt1Select).size() - 1 : index;
+                    int opt3 = 0;
+                    if (!isRestoreItem) {
+                        // wv_option3.getCurrentItem() 上一个opt3的选中位置
+                        //新opt3的位置,判断如果旧位置没有超过数据范围,则沿用旧位置,否则选中最后一项
+                        opt3 = wv_option3.getCurrentItem() >= mOptions3Items.get(opt1Select).get(index).size() - 1 ?
+                                mOptions3Items.get(opt1Select).get(index).size() - 1 : wv_option3.getCurrentItem();
+                    }
+                    wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(wv_option1.getCurrentItem()).get(index)));
+                    wv_option3.setCurrentItem(opt3);
+
+                    //3级联动数据实时回调
+                    if (optionsSelectChangeListener != null) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, opt3);
+                    }
+                } else {//只有2级联动数据,滑动第2项回调
+                    if (optionsSelectChangeListener != null) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, 0);
+                    }
+                }
+            }
+        };
+
+        // 添加联动监听
+        if (options1Items != null && linkage) {
+            wv_option1.setOnItemSelectedListener(wheelListener_option1);
+        }
+        if (options2Items != null && linkage) {
+            wv_option2.setOnItemSelectedListener(wheelListener_option2);
+        }
+        if (options3Items != null && linkage && optionsSelectChangeListener != null) {
+            wv_option3.setOnItemSelectedListener(new OnItemSelectedListener() {
+                @Override
+                public void onItemSelected(int index) {
+                    optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), wv_option2.getCurrentItem(), index);
+                }
+            });
+        }
+    }
+
+
+    //不联动情况下
+    public void setNPicker(List<T> options1Items, List<T> options2Items, List<T> options3Items) {
+
+        // 选项1
+        wv_option1.setAdapter(new ArrayWheelAdapter<>(options1Items));// 设置显示数据
+        wv_option1.setCurrentItem(0);// 初始化时显示的数据
+        // 选项2
+        if (options2Items != null) {
+            wv_option2.setAdapter(new ArrayWheelAdapter<>(options2Items));// 设置显示数据
+        }
+        wv_option2.setCurrentItem(wv_option2.getCurrentItem());// 初始化时显示的数据
+        // 选项3
+        if (options3Items != null) {
+            wv_option3.setAdapter(new ArrayWheelAdapter<>(options3Items));// 设置显示数据
+        }
+        wv_option3.setCurrentItem(wv_option3.getCurrentItem());
+        wv_option1.setIsOptions(true);
+        wv_option2.setIsOptions(true);
+        wv_option3.setIsOptions(true);
+
+        if (optionsSelectChangeListener != null) {
+            wv_option1.setOnItemSelectedListener(new OnItemSelectedListener() {
+                @Override
+                public void onItemSelected(int index) {
+                    optionsSelectChangeListener.onOptionsSelectChanged(index, wv_option2.getCurrentItem(), wv_option3.getCurrentItem());
+                }
+            });
+        }
+
+        if (options2Items == null) {
+            wv_option2.setVisibility(View.GONE);
+        } else {
+            wv_option2.setVisibility(View.VISIBLE);
+            if (optionsSelectChangeListener != null) {
+                wv_option2.setOnItemSelectedListener(new OnItemSelectedListener() {
+                    @Override
+                    public void onItemSelected(int index) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), index, wv_option3.getCurrentItem());
+                    }
+                });
+            }
+        }
+        if (options3Items == null) {
+            wv_option3.setVisibility(View.GONE);
+        } else {
+            wv_option3.setVisibility(View.VISIBLE);
+            if (optionsSelectChangeListener != null) {
+                wv_option3.setOnItemSelectedListener(new OnItemSelectedListener() {
+                    @Override
+                    public void onItemSelected(int index) {
+                        optionsSelectChangeListener.onOptionsSelectChanged(wv_option1.getCurrentItem(), wv_option2.getCurrentItem(), index);
+                    }
+                });
+            }
+        }
+    }
+
+    public void setTextContentSize(int textSize) {
+        wv_option1.setTextSize(textSize);
+        wv_option2.setTextSize(textSize);
+        wv_option3.setTextSize(textSize);
+    }
+
+    private void setLineSpacingMultiplier() {
+
+    }
+
+    /**
+     * 设置选项的单位
+     *
+     * @param label1 单位
+     * @param label2 单位
+     * @param label3 单位
+     */
+    public void setLabels(String label1, String label2, String label3) {
+        if (label1 != null) {
+            wv_option1.setLabel(label1);
+        }
+        if (label2 != null) {
+            wv_option2.setLabel(label2);
+        }
+        if (label3 != null) {
+            wv_option3.setLabel(label3);
+        }
+    }
+
+    /**
+     * 设置x轴偏移量
+     */
+    public void setTextXOffset(int x_offset_one, int x_offset_two, int x_offset_three) {
+        wv_option1.setTextXOffset(x_offset_one);
+        wv_option2.setTextXOffset(x_offset_two);
+        wv_option3.setTextXOffset(x_offset_three);
+    }
+
+    /**
+     * 设置是否循环滚动
+     *
+     * @param cyclic 是否循环
+     */
+    public void setCyclic(boolean cyclic) {
+        wv_option1.setCyclic(cyclic);
+        wv_option2.setCyclic(cyclic);
+        wv_option3.setCyclic(cyclic);
+    }
+
+    /**
+     * 设置字体样式
+     *
+     * @param font 系统提供的几种样式
+     */
+    public void setTypeface(Typeface font) {
+        wv_option1.setTypeface(font);
+        wv_option2.setTypeface(font);
+        wv_option3.setTypeface(font);
+    }
+
+    /**
+     * 分别设置第一二三级是否循环滚动
+     *
+     * @param cyclic1,cyclic2,cyclic3 是否循环
+     */
+    public void setCyclic(boolean cyclic1, boolean cyclic2, boolean cyclic3) {
+        wv_option1.setCyclic(cyclic1);
+        wv_option2.setCyclic(cyclic2);
+        wv_option3.setCyclic(cyclic3);
+    }
+
+    /**
+     * 返回当前选中的结果对应的位置数组 因为支持三级联动效果,分三个级别索引,0,1,2。
+     * 在快速滑动未停止时,点击确定按钮,会进行判断,如果匹配数据越界,则设为0,防止index出错导致崩溃。
+     *
+     * @return 索引数组
+     */
+    public int[] getCurrentItems() {
+        int[] currentItems = new int[3];
+        currentItems[0] = wv_option1.getCurrentItem();
+
+        if (mOptions2Items != null && mOptions2Items.size() > 0) {//非空判断
+            currentItems[1] = wv_option2.getCurrentItem() > (mOptions2Items.get(currentItems[0]).size() - 1) ? 0 : wv_option2.getCurrentItem();
+        } else {
+            currentItems[1] = wv_option2.getCurrentItem();
+        }
+
+        if (mOptions3Items != null && mOptions3Items.size() > 0) {//非空判断
+            currentItems[2] = wv_option3.getCurrentItem() > (mOptions3Items.get(currentItems[0]).get(currentItems[1]).size() - 1) ? 0 : wv_option3.getCurrentItem();
+        } else {
+            currentItems[2] = wv_option3.getCurrentItem();
+        }
+
+        return currentItems;
+    }
+
+    public void setCurrentItems(int option1, int option2, int option3) {
+        if (linkage) {
+            itemSelected(option1, option2, option3);
+        } else {
+            wv_option1.setCurrentItem(option1);
+            wv_option2.setCurrentItem(option2);
+            wv_option3.setCurrentItem(option3);
+        }
+    }
+
+    private void itemSelected(int opt1Select, int opt2Select, int opt3Select) {
+        if (mOptions1Items != null) {
+            wv_option1.setCurrentItem(opt1Select);
+        }
+        if (mOptions2Items != null) {
+            wv_option2.setAdapter(new ArrayWheelAdapter(mOptions2Items.get(opt1Select)));
+            wv_option2.setCurrentItem(opt2Select);
+        }
+        if (mOptions3Items != null) {
+            wv_option3.setAdapter(new ArrayWheelAdapter(mOptions3Items.get(opt1Select).get(opt2Select)));
+            wv_option3.setCurrentItem(opt3Select);
+        }
+    }
+
+    /**
+     * 设置间距倍数,但是只能在1.2-4.0f之间
+     *
+     * @param lineSpacingMultiplier
+     */
+    public void setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        wv_option1.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_option2.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_option3.setLineSpacingMultiplier(lineSpacingMultiplier);
+    }
+
+    /**
+     * 设置分割线的颜色
+     *
+     * @param dividerColor
+     */
+    public void setDividerColor(int dividerColor) {
+        wv_option1.setDividerColor(dividerColor);
+        wv_option2.setDividerColor(dividerColor);
+        wv_option3.setDividerColor(dividerColor);
+    }
+
+    /**
+     * 设置分割线的颜色
+     *
+     * @param padding
+     */
+    public void setDividerPadding(int padding) {
+        wv_option1.setDividerPadding(padding);
+        wv_option2.setDividerPadding(padding);
+        wv_option3.setDividerPadding(padding);
+    }
+
+    /**
+     * 设置分割线的类型
+     *
+     * @param dividerType
+     */
+    public void setDividerType(WheelView.DividerType dividerType) {
+        wv_option1.setDividerType(dividerType);
+        wv_option2.setDividerType(dividerType);
+        wv_option3.setDividerType(dividerType);
+    }
+
+    /**
+     * 设置分割线之间的文字的颜色
+     *
+     * @param textColorCenter
+     */
+    public void setTextColorCenter(int textColorCenter) {
+        wv_option1.setTextColorCenter(textColorCenter);
+        wv_option2.setTextColorCenter(textColorCenter);
+        wv_option3.setTextColorCenter(textColorCenter);
+    }
+
+    /**
+     * 设置分割线以外文字的颜色
+     *
+     * @param textColorOut
+     */
+    public void setTextColorOut(int textColorOut) {
+        wv_option1.setTextColorOut(textColorOut);
+        wv_option2.setTextColorOut(textColorOut);
+        wv_option3.setTextColorOut(textColorOut);
+    }
+
+    /**
+     * Label 是否只显示中间选中项的
+     *
+     * @param isCenterLabel
+     */
+    public void isCenterLabel(boolean isCenterLabel) {
+        wv_option1.isCenterLabel(isCenterLabel);
+        wv_option2.isCenterLabel(isCenterLabel);
+        wv_option3.isCenterLabel(isCenterLabel);
+    }
+
+    public void setOptionsSelectChangeListener(OnOptionsSelectChangeListener optionsSelectChangeListener) {
+        this.optionsSelectChangeListener = optionsSelectChangeListener;
+    }
+
+    public void setLinkage(boolean linkage) {
+        this.linkage = linkage;
+    }
+
+    /**
+     * 设置最大可见数目
+     *
+     * @param itemsVisible 建议设置为 3 ~ 9之间。
+     */
+    public void setItemsVisible(int itemsVisible) {
+        wv_option1.setItemsVisibleCount(itemsVisible);
+        wv_option2.setItemsVisibleCount(itemsVisible);
+        wv_option3.setItemsVisibleCount(itemsVisible);
+    }
+
+    public void setAlphaGradient(boolean isAlphaGradient) {
+        wv_option1.setAlphaGradient(isAlphaGradient);
+        wv_option2.setAlphaGradient(isAlphaGradient);
+        wv_option3.setAlphaGradient(isAlphaGradient);
+    }
+}

+ 915 - 0
pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java

@@ -0,0 +1,915 @@
+package com.bigkoo.pickerview.view;
+
+import android.view.View;
+
+import com.bigkoo.pickerview.R;
+import com.bigkoo.pickerview.adapter.ArrayWheelAdapter;
+import com.bigkoo.pickerview.adapter.NumericWheelAdapter;
+import com.bigkoo.pickerview.listener.ISelectTimeCallback;
+import com.bigkoo.pickerview.utils.ChinaDate;
+import com.bigkoo.pickerview.utils.LunarCalendar;
+import com.contrarywind.listener.OnItemSelectedListener;
+import com.contrarywind.view.WheelView;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.List;
+
+
+public class WheelTime {
+    public static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private View view;
+    private WheelView wv_year;
+    private WheelView wv_month;
+    private WheelView wv_day;
+    private WheelView wv_hours;
+    private WheelView wv_minutes;
+    private WheelView wv_seconds;
+    private int gravity;
+
+    private boolean[] type;
+    private static final int DEFAULT_START_YEAR = 1900;
+    private static final int DEFAULT_END_YEAR = 2100;
+    private static final int DEFAULT_START_MONTH = 1;
+    private static final int DEFAULT_END_MONTH = 12;
+    private static final int DEFAULT_START_DAY = 1;
+    private static final int DEFAULT_END_DAY = 31;
+
+    private int startYear = DEFAULT_START_YEAR;
+    private int endYear = DEFAULT_END_YEAR;
+    private int startMonth = DEFAULT_START_MONTH;
+    private int endMonth = DEFAULT_END_MONTH;
+    private int startDay = DEFAULT_START_DAY;
+    private int endDay = DEFAULT_END_DAY; //表示31天的
+    private int currentYear;
+
+    private int textSize;
+
+    private boolean isLunarCalendar = false;
+    private ISelectTimeCallback mSelectChangeCallback;
+
+    public WheelTime(View view, boolean[] type, int gravity, int textSize) {
+        super();
+        this.view = view;
+        this.type = type;
+        this.gravity = gravity;
+        this.textSize = textSize;
+    }
+
+    public void setLunarMode(boolean isLunarCalendar) {
+        this.isLunarCalendar = isLunarCalendar;
+    }
+
+    public boolean isLunarMode() {
+        return isLunarCalendar;
+    }
+
+    public void setPicker(int year, int month, int day) {
+        this.setPicker(year, month, day, 0, 0, 0);
+    }
+
+    public void setPicker(int year, final int month, int day, int h, int m, int s) {
+        if (isLunarCalendar) {
+            int[] lunar = LunarCalendar.solarToLunar(year, month + 1, day);
+            setLunar(lunar[0], lunar[1] - 1, lunar[2], lunar[3] == 1, h, m, s);
+        } else {
+            setSolar(year, month, day, h, m, s);
+        }
+    }
+
+    /**
+     * 设置农历
+     *
+     * @param year
+     * @param month
+     * @param day
+     * @param h
+     * @param m
+     * @param s
+     */
+    private void setLunar(int year, final int month, int day, boolean isLeap, int h, int m, int s) {
+        // 年
+        wv_year = (WheelView) view.findViewById(R.id.year);
+        wv_year.setAdapter(new ArrayWheelAdapter(ChinaDate.getYears(startYear, endYear)));// 设置"年"的显示数据
+        wv_year.setLabel("");// 添加文字
+        wv_year.setCurrentItem(year - startYear);// 初始化时显示的数据
+        wv_year.setGravity(gravity);
+
+        // 月
+        wv_month = (WheelView) view.findViewById(R.id.month);
+        wv_month.setAdapter(new ArrayWheelAdapter(ChinaDate.getMonths(year)));
+        wv_month.setLabel("");
+
+        int leapMonth = ChinaDate.leapMonth(year);
+        if (leapMonth != 0 && (month > leapMonth - 1 || isLeap)) { //选中月是闰月或大于闰月
+            wv_month.setCurrentItem(month + 1);
+        } else {
+            wv_month.setCurrentItem(month);
+        }
+
+        wv_month.setGravity(gravity);
+
+        // 日
+        wv_day = (WheelView) view.findViewById(R.id.day);
+        // 判断大小月及是否闰年,用来确定"日"的数据
+        if (ChinaDate.leapMonth(year) == 0) {
+            wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year, month))));
+        } else {
+            wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year))));
+        }
+        wv_day.setLabel("");
+        wv_day.setCurrentItem(day - 1);
+        wv_day.setGravity(gravity);
+
+        wv_hours = (WheelView) view.findViewById(R.id.hour);
+        wv_hours.setAdapter(new NumericWheelAdapter(0, 23));
+        //wv_hours.setLabel(context.getString(R.string.pickerview_hours));// 添加文字
+        wv_hours.setCurrentItem(h);
+        wv_hours.setGravity(gravity);
+
+        wv_minutes = (WheelView) view.findViewById(R.id.min);
+        wv_minutes.setAdapter(new NumericWheelAdapter(0, 59));
+        //wv_minutes.setLabel(context.getString(R.string.pickerview_minutes));// 添加文字
+        wv_minutes.setCurrentItem(m);
+        wv_minutes.setGravity(gravity);
+
+        wv_seconds = (WheelView) view.findViewById(R.id.second);
+        wv_seconds.setAdapter(new NumericWheelAdapter(0, 59));
+        //wv_seconds.setLabel(context.getString(R.string.pickerview_minutes));// 添加文字
+        wv_seconds.setCurrentItem(m);
+        wv_seconds.setGravity(gravity);
+
+        // 添加"年"监听
+        wv_year.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index) {
+                int year_num = index + startYear;
+                // 判断是不是闰年,来确定月和日的选择
+                wv_month.setAdapter(new ArrayWheelAdapter(ChinaDate.getMonths(year_num)));
+                if (ChinaDate.leapMonth(year_num) != 0 && wv_month.getCurrentItem() > ChinaDate.leapMonth(year_num) - 1) {
+                    wv_month.setCurrentItem(wv_month.getCurrentItem() + 1);
+                } else {
+                    wv_month.setCurrentItem(wv_month.getCurrentItem());
+                }
+
+                int currentIndex = wv_day.getCurrentItem();
+                int maxItem = 29;
+                if (ChinaDate.leapMonth(year_num) != 0 && wv_month.getCurrentItem() > ChinaDate.leapMonth(year_num) - 1) {
+                    if (wv_month.getCurrentItem() == ChinaDate.leapMonth(year_num) + 1) {
+                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year_num))));
+                        maxItem = ChinaDate.leapDays(year_num);
+                    } else {
+                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, wv_month.getCurrentItem()))));
+                        maxItem = ChinaDate.monthDays(year_num, wv_month.getCurrentItem());
+                    }
+                } else {
+                    wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, wv_month.getCurrentItem() + 1))));
+                    maxItem = ChinaDate.monthDays(year_num, wv_month.getCurrentItem() + 1);
+                }
+
+                if (currentIndex > maxItem - 1) {
+                    wv_day.setCurrentItem(maxItem - 1);
+                }
+
+                if (mSelectChangeCallback != null) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            }
+        });
+
+        // 添加"月"监听
+        wv_month.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index) {
+                int month_num = index;
+                int year_num = wv_year.getCurrentItem() + startYear;
+                int currentIndex = wv_day.getCurrentItem();
+                int maxItem = 29;
+                if (ChinaDate.leapMonth(year_num) != 0 && month_num > ChinaDate.leapMonth(year_num) - 1) {
+                    if (wv_month.getCurrentItem() == ChinaDate.leapMonth(year_num) + 1) {
+                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.leapDays(year_num))));
+                        maxItem = ChinaDate.leapDays(year_num);
+                    } else {
+                        wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, month_num))));
+                        maxItem = ChinaDate.monthDays(year_num, month_num);
+                    }
+                } else {
+                    wv_day.setAdapter(new ArrayWheelAdapter(ChinaDate.getLunarDays(ChinaDate.monthDays(year_num, month_num + 1))));
+                    maxItem = ChinaDate.monthDays(year_num, month_num + 1);
+                }
+
+                if (currentIndex > maxItem - 1) {
+                    wv_day.setCurrentItem(maxItem - 1);
+                }
+
+                if (mSelectChangeCallback != null) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            }
+        });
+
+        setChangedListener(wv_day);
+        setChangedListener(wv_hours);
+        setChangedListener(wv_minutes);
+        setChangedListener(wv_seconds);
+
+        if (type.length != 6) {
+            throw new RuntimeException("type[] length is not 6");
+        }
+        wv_year.setVisibility(type[0] ? View.VISIBLE : View.GONE);
+        wv_month.setVisibility(type[1] ? View.VISIBLE : View.GONE);
+        wv_day.setVisibility(type[2] ? View.VISIBLE : View.GONE);
+        wv_hours.setVisibility(type[3] ? View.VISIBLE : View.GONE);
+        wv_minutes.setVisibility(type[4] ? View.VISIBLE : View.GONE);
+        wv_seconds.setVisibility(type[5] ? View.VISIBLE : View.GONE);
+        setContentTextSize();
+    }
+
+    /**
+     * 设置公历
+     *
+     * @param year
+     * @param month
+     * @param day
+     * @param h
+     * @param m
+     * @param s
+     */
+    private void setSolar(int year, final int month, int day, int h, int m, int s) {
+        // 添加大小月月份并将其转换为list,方便之后的判断
+        String[] months_big = {"1", "3", "5", "7", "8", "10", "12"};
+        String[] months_little = {"4", "6", "9", "11"};
+
+        final List<String> list_big = Arrays.asList(months_big);
+        final List<String> list_little = Arrays.asList(months_little);
+
+        currentYear = year;
+        // 年
+        wv_year = (WheelView) view.findViewById(R.id.year);
+        wv_year.setAdapter(new NumericWheelAdapter(startYear, endYear));// 设置"年"的显示数据
+
+
+        wv_year.setCurrentItem(year - startYear);// 初始化时显示的数据
+        wv_year.setGravity(gravity);
+        // 月
+        wv_month = (WheelView) view.findViewById(R.id.month);
+        if (startYear == endYear) {//开始年等于终止年
+            wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth));
+            wv_month.setCurrentItem(month + 1 - startMonth);
+        } else if (year == startYear) {
+            //起始日期的月份控制
+            wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12));
+            wv_month.setCurrentItem(month + 1 - startMonth);
+        } else if (year == endYear) {
+            //终止日期的月份控制
+            wv_month.setAdapter(new NumericWheelAdapter(1, endMonth));
+            wv_month.setCurrentItem(month);
+        } else {
+            wv_month.setAdapter(new NumericWheelAdapter(1, 12));
+            wv_month.setCurrentItem(month);
+        }
+        wv_month.setGravity(gravity);
+        // 日
+        wv_day = (WheelView) view.findViewById(R.id.day);
+
+        boolean leapYear = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
+        if (startYear == endYear && startMonth == endMonth) {
+            if (list_big.contains(String.valueOf(month + 1))) {
+                if (endDay > 31) {
+                    endDay = 31;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
+            } else if (list_little.contains(String.valueOf(month + 1))) {
+                if (endDay > 30) {
+                    endDay = 30;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
+            } else {
+                // 闰年
+                if (leapYear) {
+                    if (endDay > 29) {
+                        endDay = 29;
+                    }
+                    wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
+                } else {
+                    if (endDay > 28) {
+                        endDay = 28;
+                    }
+                    wv_day.setAdapter(new NumericWheelAdapter(startDay, endDay));
+                }
+            }
+            wv_day.setCurrentItem(day - startDay);
+        } else if (year == startYear && month + 1 == startMonth) {
+            // 起始日期的天数控制
+            if (list_big.contains(String.valueOf(month + 1))) {
+
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, 31));
+            } else if (list_little.contains(String.valueOf(month + 1))) {
+
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, 30));
+            } else {
+                // 闰年 29,平年 28
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, leapYear ? 29 : 28));
+            }
+            wv_day.setCurrentItem(day - startDay);
+        } else if (year == endYear && month + 1 == endMonth) {
+            // 终止日期的天数控制
+            if (list_big.contains(String.valueOf(month + 1))) {
+                if (endDay > 31) {
+                    endDay = 31;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
+            } else if (list_little.contains(String.valueOf(month + 1))) {
+                if (endDay > 30) {
+                    endDay = 30;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
+            } else {
+                // 闰年
+                if (leapYear) {
+                    if (endDay > 29) {
+                        endDay = 29;
+                    }
+                    wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
+                } else {
+                    if (endDay > 28) {
+                        endDay = 28;
+                    }
+                    wv_day.setAdapter(new NumericWheelAdapter(1, endDay));
+                }
+            }
+            wv_day.setCurrentItem(day - 1);
+        } else {
+            // 判断大小月及是否闰年,用来确定"日"的数据
+            if (list_big.contains(String.valueOf(month + 1))) {
+                wv_day.setAdapter(new NumericWheelAdapter(1, 31));
+            } else if (list_little.contains(String.valueOf(month + 1))) {
+                wv_day.setAdapter(new NumericWheelAdapter(1, 30));
+            } else {
+                // 闰年 29,平年 28
+                wv_day.setAdapter(new NumericWheelAdapter(startDay, leapYear ? 29 : 28));
+            }
+            wv_day.setCurrentItem(day - 1);
+        }
+
+        wv_day.setGravity(gravity);
+        //时
+        wv_hours = (WheelView) view.findViewById(R.id.hour);
+        wv_hours.setAdapter(new NumericWheelAdapter(0, 23));
+
+        wv_hours.setCurrentItem(h);
+        wv_hours.setGravity(gravity);
+        //分
+        wv_minutes = (WheelView) view.findViewById(R.id.min);
+        wv_minutes.setAdapter(new NumericWheelAdapter(0, 59));
+
+        wv_minutes.setCurrentItem(m);
+        wv_minutes.setGravity(gravity);
+        //秒
+        wv_seconds = (WheelView) view.findViewById(R.id.second);
+        wv_seconds.setAdapter(new NumericWheelAdapter(0, 59));
+
+        wv_seconds.setCurrentItem(s);
+        wv_seconds.setGravity(gravity);
+
+        // 添加"年"监听
+        wv_year.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index) {
+                int year_num = index + startYear;
+                currentYear = year_num;
+                int currentMonthItem = wv_month.getCurrentItem();//记录上一次的item位置
+                // 判断大小月及是否闰年,用来确定"日"的数据
+                if (startYear == endYear) {
+                    //重新设置月份
+                    wv_month.setAdapter(new NumericWheelAdapter(startMonth, endMonth));
+
+                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
+                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
+                        wv_month.setCurrentItem(currentMonthItem);
+                    }
+
+                    int monthNum = currentMonthItem + startMonth;
+
+                    if (startMonth == endMonth) {
+                        //重新设置日
+                        setReDay(year_num, monthNum, startDay, endDay, list_big, list_little);
+                    } else if (monthNum == startMonth) {
+                        //重新设置日
+                        setReDay(year_num, monthNum, startDay, 31, list_big, list_little);
+                    } else if (monthNum == endMonth) {
+                        setReDay(year_num, monthNum, 1, endDay, list_big, list_little);
+                    } else {//重新设置日
+                        setReDay(year_num, monthNum, 1, 31, list_big, list_little);
+                    }
+                } else if (year_num == startYear) {//等于开始的年
+                    //重新设置月份
+                    wv_month.setAdapter(new NumericWheelAdapter(startMonth, 12));
+
+                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
+                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
+                        wv_month.setCurrentItem(currentMonthItem);
+                    }
+
+                    int month = currentMonthItem + startMonth;
+                    if (month == startMonth) {
+                        //重新设置日
+                        setReDay(year_num, month, startDay, 31, list_big, list_little);
+                    } else {
+                        //重新设置日
+                        setReDay(year_num, month, 1, 31, list_big, list_little);
+                    }
+
+                } else if (year_num == endYear) {
+                    //重新设置月份
+                    wv_month.setAdapter(new NumericWheelAdapter(1, endMonth));
+                    if (currentMonthItem > wv_month.getAdapter().getItemsCount() - 1) {
+                        currentMonthItem = wv_month.getAdapter().getItemsCount() - 1;
+                        wv_month.setCurrentItem(currentMonthItem);
+                    }
+                    int monthNum = currentMonthItem + 1;
+
+                    if (monthNum == endMonth) {
+                        //重新设置日
+                        setReDay(year_num, monthNum, 1, endDay, list_big, list_little);
+                    } else {
+                        //重新设置日
+                        setReDay(year_num, monthNum, 1, 31, list_big, list_little);
+                    }
+
+                } else {
+                    //重新设置月份
+                    wv_month.setAdapter(new NumericWheelAdapter(1, 12));
+                    //重新设置日
+                    setReDay(year_num, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little);
+                }
+
+                if (mSelectChangeCallback != null) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            }
+        });
+
+
+        // 添加"月"监听
+        wv_month.setOnItemSelectedListener(new OnItemSelectedListener() {
+            @Override
+            public void onItemSelected(int index) {
+                int month_num = index + 1;
+
+                if (startYear == endYear) {
+                    month_num = month_num + startMonth - 1;
+                    if (startMonth == endMonth) {
+                        //重新设置日
+                        setReDay(currentYear, month_num, startDay, endDay, list_big, list_little);
+                    } else if (startMonth == month_num) {
+
+                        //重新设置日
+                        setReDay(currentYear, month_num, startDay, 31, list_big, list_little);
+                    } else if (endMonth == month_num) {
+                        setReDay(currentYear, month_num, 1, endDay, list_big, list_little);
+                    } else {
+                        setReDay(currentYear, month_num, 1, 31, list_big, list_little);
+                    }
+                } else if (currentYear == startYear) {
+                    month_num = month_num + startMonth - 1;
+                    if (month_num == startMonth) {
+                        //重新设置日
+                        setReDay(currentYear, month_num, startDay, 31, list_big, list_little);
+                    } else {
+                        //重新设置日
+                        setReDay(currentYear, month_num, 1, 31, list_big, list_little);
+                    }
+
+                } else if (currentYear == endYear) {
+                    if (month_num == endMonth) {
+                        //重新设置日
+                        setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, endDay, list_big, list_little);
+                    } else {
+                        setReDay(currentYear, wv_month.getCurrentItem() + 1, 1, 31, list_big, list_little);
+                    }
+
+                } else {
+                    //重新设置日
+                    setReDay(currentYear, month_num, 1, 31, list_big, list_little);
+                }
+
+                if (mSelectChangeCallback != null) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            }
+        });
+
+        setChangedListener(wv_day);
+        setChangedListener(wv_hours);
+        setChangedListener(wv_minutes);
+        setChangedListener(wv_seconds);
+
+        if (type.length != 6) {
+            throw new IllegalArgumentException("type[] length is not 6");
+        }
+        wv_year.setVisibility(type[0] ? View.VISIBLE : View.GONE);
+        wv_month.setVisibility(type[1] ? View.VISIBLE : View.GONE);
+        wv_day.setVisibility(type[2] ? View.VISIBLE : View.GONE);
+        wv_hours.setVisibility(type[3] ? View.VISIBLE : View.GONE);
+        wv_minutes.setVisibility(type[4] ? View.VISIBLE : View.GONE);
+        wv_seconds.setVisibility(type[5] ? View.VISIBLE : View.GONE);
+        setContentTextSize();
+    }
+
+    private void setChangedListener(WheelView wheelView) {
+        if (mSelectChangeCallback != null) {
+            wheelView.setOnItemSelectedListener(new OnItemSelectedListener() {
+                @Override
+                public void onItemSelected(int index) {
+                    mSelectChangeCallback.onTimeSelectChanged();
+                }
+            });
+        }
+
+    }
+
+
+    private void setReDay(int year_num, int monthNum, int startD, int endD, List<String> list_big, List<String> list_little) {
+        int currentItem = wv_day.getCurrentItem();
+
+//        int maxItem;
+        if (list_big.contains(String.valueOf(monthNum))) {
+            if (endD > 31) {
+                endD = 31;
+            }
+            wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
+//            maxItem = endD;
+        } else if (list_little.contains(String.valueOf(monthNum))) {
+            if (endD > 30) {
+                endD = 30;
+            }
+            wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
+//            maxItem = endD;
+        } else {
+            if ((year_num % 4 == 0 && year_num % 100 != 0)
+                    || year_num % 400 == 0) {
+                if (endD > 29) {
+                    endD = 29;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
+//                maxItem = endD;
+            } else {
+                if (endD > 28) {
+                    endD = 28;
+                }
+                wv_day.setAdapter(new NumericWheelAdapter(startD, endD));
+//                maxItem = endD;
+            }
+        }
+
+        if (currentItem > wv_day.getAdapter().getItemsCount() - 1) {
+            currentItem = wv_day.getAdapter().getItemsCount() - 1;
+            wv_day.setCurrentItem(currentItem);
+        }
+    }
+
+
+    private void setContentTextSize() {
+        wv_day.setTextSize(textSize);
+        wv_month.setTextSize(textSize);
+        wv_year.setTextSize(textSize);
+        wv_hours.setTextSize(textSize);
+        wv_minutes.setTextSize(textSize);
+        wv_seconds.setTextSize(textSize);
+    }
+
+
+    public void setLabels(String label_year, String label_month, String label_day, String label_hours, String label_mins, String label_seconds) {
+        if (isLunarCalendar) {
+            return;
+        }
+
+        if (label_year != null) {
+            wv_year.setLabel(label_year);
+        } else {
+            wv_year.setLabel(view.getContext().getString(R.string.pickerview_year));
+        }
+        if (label_month != null) {
+            wv_month.setLabel(label_month);
+        } else {
+            wv_month.setLabel(view.getContext().getString(R.string.pickerview_month));
+        }
+        if (label_day != null) {
+            wv_day.setLabel(label_day);
+        } else {
+            wv_day.setLabel(view.getContext().getString(R.string.pickerview_day));
+        }
+        if (label_hours != null) {
+            wv_hours.setLabel(label_hours);
+        } else {
+            wv_hours.setLabel(view.getContext().getString(R.string.pickerview_hours));
+        }
+        if (label_mins != null) {
+            wv_minutes.setLabel(label_mins);
+        } else {
+            wv_minutes.setLabel(view.getContext().getString(R.string.pickerview_minutes));
+        }
+        if (label_seconds != null) {
+            wv_seconds.setLabel(label_seconds);
+        } else {
+            wv_seconds.setLabel(view.getContext().getString(R.string.pickerview_seconds));
+        }
+
+    }
+
+    public void setTextXOffset(int x_offset_year, int x_offset_month, int x_offset_day,
+                               int x_offset_hours, int x_offset_minutes, int x_offset_seconds) {
+        wv_year.setTextXOffset(x_offset_year);
+        wv_month.setTextXOffset(x_offset_month);
+        wv_day.setTextXOffset(x_offset_day);
+        wv_hours.setTextXOffset(x_offset_hours);
+        wv_minutes.setTextXOffset(x_offset_minutes);
+        wv_seconds.setTextXOffset(x_offset_seconds);
+    }
+
+    /**
+     * 设置是否循环滚动
+     *
+     * @param cyclic
+     */
+    public void setCyclic(boolean cyclic) {
+        wv_year.setCyclic(cyclic);
+        wv_month.setCyclic(cyclic);
+        wv_day.setCyclic(cyclic);
+        wv_hours.setCyclic(cyclic);
+        wv_minutes.setCyclic(cyclic);
+        wv_seconds.setCyclic(cyclic);
+    }
+
+    public String getTime() {
+        if (isLunarCalendar) {
+            //如果是农历 返回对应的公历时间
+            return getLunarTime();
+        }
+        StringBuilder sb = new StringBuilder();
+        if (currentYear == startYear) {
+           /* int i = wv_month.getCurrentItem() + startMonth;
+            System.out.println("i:" + i);*/
+            if ((wv_month.getCurrentItem() + startMonth) == startMonth) {
+                sb.append((wv_year.getCurrentItem() + startYear)).append("-")
+                        .append((wv_month.getCurrentItem() + startMonth)).append("-")
+                        .append((wv_day.getCurrentItem() + startDay)).append(" ")
+                        .append(wv_hours.getCurrentItem()).append(":")
+                        .append(wv_minutes.getCurrentItem()).append(":")
+                        .append(wv_seconds.getCurrentItem());
+            } else {
+                sb.append((wv_year.getCurrentItem() + startYear)).append("-")
+                        .append((wv_month.getCurrentItem() + startMonth)).append("-")
+                        .append((wv_day.getCurrentItem() + 1)).append(" ")
+                        .append(wv_hours.getCurrentItem()).append(":")
+                        .append(wv_minutes.getCurrentItem()).append(":")
+                        .append(wv_seconds.getCurrentItem());
+            }
+
+        } else {
+            sb.append((wv_year.getCurrentItem() + startYear)).append("-")
+                    .append((wv_month.getCurrentItem() + 1)).append("-")
+                    .append((wv_day.getCurrentItem() + 1)).append(" ")
+                    .append(wv_hours.getCurrentItem()).append(":")
+                    .append(wv_minutes.getCurrentItem()).append(":")
+                    .append(wv_seconds.getCurrentItem());
+        }
+
+        return sb.toString();
+    }
+
+
+    /**
+     * 农历返回对应的公历时间
+     *
+     * @return
+     */
+    private String getLunarTime() {
+        StringBuilder sb = new StringBuilder();
+        int year = wv_year.getCurrentItem() + startYear;
+        int month = 1;
+        boolean isLeapMonth = false;
+        if (ChinaDate.leapMonth(year) == 0) {
+            month = wv_month.getCurrentItem() + 1;
+        } else {
+            if ((wv_month.getCurrentItem() + 1) - ChinaDate.leapMonth(year) <= 0) {
+                month = wv_month.getCurrentItem() + 1;
+            } else if ((wv_month.getCurrentItem() + 1) - ChinaDate.leapMonth(year) == 1) {
+                month = wv_month.getCurrentItem();
+                isLeapMonth = true;
+            } else {
+                month = wv_month.getCurrentItem();
+            }
+        }
+        int day = wv_day.getCurrentItem() + 1;
+        int[] solar = LunarCalendar.lunarToSolar(year, month, day, isLeapMonth);
+
+        sb.append(solar[0]).append("-")
+                .append(solar[1]).append("-")
+                .append(solar[2]).append(" ")
+                .append(wv_hours.getCurrentItem()).append(":")
+                .append(wv_minutes.getCurrentItem()).append(":")
+                .append(wv_seconds.getCurrentItem());
+        return sb.toString();
+    }
+
+    public View getView() {
+        return view;
+    }
+
+    public int getStartYear() {
+        return startYear;
+    }
+
+    public void setStartYear(int startYear) {
+        this.startYear = startYear;
+    }
+
+    public int getEndYear() {
+        return endYear;
+    }
+
+    public void setEndYear(int endYear) {
+        this.endYear = endYear;
+    }
+
+
+    public void setRangDate(Calendar startDate, Calendar endDate) {
+
+        if (startDate == null && endDate != null) {
+            int year = endDate.get(Calendar.YEAR);
+            int month = endDate.get(Calendar.MONTH) + 1;
+            int day = endDate.get(Calendar.DAY_OF_MONTH);
+            if (year > startYear) {
+                this.endYear = year;
+                this.endMonth = month;
+                this.endDay = day;
+            } else if (year == startYear) {
+                if (month > startMonth) {
+                    this.endYear = year;
+                    this.endMonth = month;
+                    this.endDay = day;
+                } else if (month == startMonth) {
+                    if (day > startDay) {
+                        this.endYear = year;
+                        this.endMonth = month;
+                        this.endDay = day;
+                    }
+                }
+            }
+
+        } else if (startDate != null && endDate == null) {
+            int year = startDate.get(Calendar.YEAR);
+            int month = startDate.get(Calendar.MONTH) + 1;
+            int day = startDate.get(Calendar.DAY_OF_MONTH);
+            if (year < endYear) {
+                this.startMonth = month;
+                this.startDay = day;
+                this.startYear = year;
+            } else if (year == endYear) {
+                if (month < endMonth) {
+                    this.startMonth = month;
+                    this.startDay = day;
+                    this.startYear = year;
+                } else if (month == endMonth) {
+                    if (day < endDay) {
+                        this.startMonth = month;
+                        this.startDay = day;
+                        this.startYear = year;
+                    }
+                }
+            }
+
+        } else if (startDate != null && endDate != null) {
+            this.startYear = startDate.get(Calendar.YEAR);
+            this.endYear = endDate.get(Calendar.YEAR);
+            this.startMonth = startDate.get(Calendar.MONTH) + 1;
+            this.endMonth = endDate.get(Calendar.MONTH) + 1;
+            this.startDay = startDate.get(Calendar.DAY_OF_MONTH);
+            this.endDay = endDate.get(Calendar.DAY_OF_MONTH);
+        }
+
+    }
+
+    /**
+     * 设置间距倍数,但是只能在1.0-4.0f之间
+     *
+     * @param lineSpacingMultiplier
+     */
+    public void setLineSpacingMultiplier(float lineSpacingMultiplier) {
+        wv_day.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_month.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_year.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_hours.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_minutes.setLineSpacingMultiplier(lineSpacingMultiplier);
+        wv_seconds.setLineSpacingMultiplier(lineSpacingMultiplier);
+    }
+
+    /**
+     * 设置分割线的颜色
+     *
+     * @param dividerColor
+     */
+    public void setDividerColor(int dividerColor) {
+        wv_day.setDividerColor(dividerColor);
+        wv_month.setDividerColor(dividerColor);
+        wv_year.setDividerColor(dividerColor);
+        wv_hours.setDividerColor(dividerColor);
+        wv_minutes.setDividerColor(dividerColor);
+        wv_seconds.setDividerColor(dividerColor);
+    }
+
+    /**
+     * 设置分割线的颜色
+     *
+     * @param padding
+     */
+    public void setDividerPadding(int padding) {
+        view.setPadding(padding,0,padding,0);
+//        wv_day.setDividerPadding(padding);
+//        wv_month.setDividerPadding(padding);
+//        wv_year.setDividerPadding(padding);
+//        wv_hours.setDividerPadding(padding);
+//        wv_minutes.setDividerPadding(padding);
+//        wv_seconds.setDividerPadding(padding);
+    }
+
+    /**
+     * 设置分割线的类型
+     *
+     * @param dividerType
+     */
+    public void setDividerType(WheelView.DividerType dividerType) {
+        wv_day.setDividerType(dividerType);
+        wv_month.setDividerType(dividerType);
+        wv_year.setDividerType(dividerType);
+        wv_hours.setDividerType(dividerType);
+        wv_minutes.setDividerType(dividerType);
+        wv_seconds.setDividerType(dividerType);
+    }
+
+    /**
+     * 设置分割线之间的文字的颜色
+     *
+     * @param textColorCenter
+     */
+    public void setTextColorCenter(int textColorCenter) {
+        wv_day.setTextColorCenter(textColorCenter);
+        wv_month.setTextColorCenter(textColorCenter);
+        wv_year.setTextColorCenter(textColorCenter);
+        wv_hours.setTextColorCenter(textColorCenter);
+        wv_minutes.setTextColorCenter(textColorCenter);
+        wv_seconds.setTextColorCenter(textColorCenter);
+    }
+
+    /**
+     * 设置分割线以外文字的颜色
+     *
+     * @param textColorOut
+     */
+    public void setTextColorOut(int textColorOut) {
+        wv_day.setTextColorOut(textColorOut);
+        wv_month.setTextColorOut(textColorOut);
+        wv_year.setTextColorOut(textColorOut);
+        wv_hours.setTextColorOut(textColorOut);
+        wv_minutes.setTextColorOut(textColorOut);
+        wv_seconds.setTextColorOut(textColorOut);
+    }
+
+    /**
+     * @param isCenterLabel 是否只显示中间选中项的
+     */
+    public void isCenterLabel(boolean isCenterLabel) {
+        wv_day.isCenterLabel(isCenterLabel);
+        wv_month.isCenterLabel(isCenterLabel);
+        wv_year.isCenterLabel(isCenterLabel);
+        wv_hours.isCenterLabel(isCenterLabel);
+        wv_minutes.isCenterLabel(isCenterLabel);
+        wv_seconds.isCenterLabel(isCenterLabel);
+    }
+
+    public void setSelectChangeCallback(ISelectTimeCallback mSelectChangeCallback) {
+        this.mSelectChangeCallback = mSelectChangeCallback;
+    }
+
+    public void setItemsVisible(int itemsVisibleCount) {
+        wv_day.setItemsVisibleCount(itemsVisibleCount);
+        wv_month.setItemsVisibleCount(itemsVisibleCount);
+        wv_year.setItemsVisibleCount(itemsVisibleCount);
+        wv_hours.setItemsVisibleCount(itemsVisibleCount);
+        wv_minutes.setItemsVisibleCount(itemsVisibleCount);
+        wv_seconds.setItemsVisibleCount(itemsVisibleCount);
+    }
+
+    public void setAlphaGradient(boolean isAlphaGradient) {
+        wv_day.setAlphaGradient(isAlphaGradient);
+        wv_month.setAlphaGradient(isAlphaGradient);
+        wv_year.setAlphaGradient(isAlphaGradient);
+        wv_hours.setAlphaGradient(isAlphaGradient);
+        wv_minutes.setAlphaGradient(isAlphaGradient);
+        wv_seconds.setAlphaGradient(isAlphaGradient);
+    }
+}

+ 19 - 0
pickerview/src/main/res/anim/pickerview_dialog_scale_in.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+  <alpha
+      android:duration="@integer/animation_default_duration"
+      android:fromAlpha="0.0"
+      android:toAlpha="1.0" />
+
+  <scale
+      android:duration="@integer/animation_default_duration"
+      android:fromXScale="0.0"
+      android:toXScale="1.0"
+      android:fromYScale="0.0"
+      android:toYScale="1.0"
+      android:pivotX="50%"
+      android:pivotY="50%"/>
+
+</set>

+ 18 - 0
pickerview/src/main/res/anim/pickerview_dialog_scale_out.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+  <alpha
+      android:duration="@integer/animation_default_duration"
+      android:fromAlpha="1.0"
+      android:toAlpha="0.3" />
+
+  <scale
+      android:duration="@integer/animation_default_duration"
+      android:fromXScale="1.0"
+      android:toXScale="0.0"
+      android:fromYScale="1.0"
+      android:toYScale="0.0"
+      android:pivotX="50%"
+      android:pivotY="50%"/>
+</set>

+ 11 - 0
pickerview/src/main/res/anim/pickerview_slide_in_bottom.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+     android:shareInterpolator="false">
+
+  <translate
+      android:duration="@integer/animation_default_duration"
+      android:fromXDelta="0%"
+      android:toXDelta="0%"
+      android:fromYDelta="100%"
+      android:toYDelta="0%"/>
+</set>

+ 11 - 0
pickerview/src/main/res/anim/pickerview_slide_out_bottom.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<set xmlns:android="http://schemas.android.com/apk/res/android"
+     android:shareInterpolator="false">
+
+  <translate
+      android:duration="@integer/animation_default_duration"
+      android:fromXDelta="0%"
+      android:toXDelta="0%"
+      android:fromYDelta="0%"
+      android:toYDelta="100%"/>
+</set>

+ 6 - 0
pickerview/src/main/res/drawable/selector_pickerview_btn.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector
+  xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:state_pressed="true" android:color="@color/pickerview_timebtn_pre" />
+    <item android:color="@color/pickerview_timebtn_nor" />
+</selector>

+ 43 - 0
pickerview/src/main/res/layout/include_pickerview_topbar.xml

@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/rv_topbar"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/pickerview_bg_topbar">
+
+    <Button
+        android:id="@+id/btnCancel"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:background="@android:color/transparent"
+        android:gravity="left|center_vertical"
+        android:paddingLeft="@dimen/pickerview_topbar_padding"
+        android:text="@string/pickerview_cancel"
+        android:textAllCaps="false"
+        android:textColor="@drawable/selector_pickerview_btn"
+        android:textSize="@dimen/pickerview_topbar_btn_textsize" />
+
+    <TextView
+        android:id="@+id/tvTitle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_toLeftOf="@+id/btnSubmit"
+        android:layout_toRightOf="@+id/btnCancel"
+        android:gravity="center"
+        android:textColor="@color/pickerview_topbar_title"
+        android:textSize="@dimen/pickerview_topbar_title_textsize" />
+
+    <Button
+        android:id="@id/btnSubmit"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignParentRight="true"
+        android:background="@android:color/transparent"
+        android:gravity="right|center_vertical"
+        android:paddingRight="@dimen/pickerview_topbar_padding"
+        android:text="@string/pickerview_submit"
+        android:textAllCaps="false"
+        android:textColor="@drawable/selector_pickerview_btn"
+        android:textSize="@dimen/pickerview_topbar_btn_textsize" />
+</RelativeLayout>

+ 16 - 0
pickerview/src/main/res/layout/layout_basepickerview.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    android:id="@+id/outmost_container"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clickable="true"
+    android:background="@color/pickerview_bgColor_overlay">
+
+    <FrameLayout
+        android:id="@+id/content_container"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+    </FrameLayout>
+
+</FrameLayout>

+ 41 - 0
pickerview/src/main/res/layout/pickerview_options.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <include
+        layout="@layout/include_pickerview_topbar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/pickerview_topbar_height" />
+
+    <LinearLayout
+        android:id="@+id/optionspicker"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@android:color/white"
+        android:gravity="center"
+        android:minHeight="180dp"
+        android:orientation="horizontal">
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/options1"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/options2"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/options3"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+    </LinearLayout>
+
+
+</LinearLayout>

+ 59 - 0
pickerview/src/main/res/layout/pickerview_time.xml

@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <include
+        layout="@layout/include_pickerview_topbar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/pickerview_topbar_height" />
+
+    <LinearLayout
+        android:id="@+id/timepicker"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@android:color/white"
+        android:gravity="center"
+        android:minHeight="150dp"
+        android:orientation="horizontal">
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/year"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="0.96" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/month"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/day"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/hour"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/min"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+
+        <com.contrarywind.view.WheelView
+            android:id="@+id/second"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1" />
+    </LinearLayout>
+
+
+</LinearLayout>

+ 11 - 0
pickerview/src/main/res/values-en/strings.xml

@@ -0,0 +1,11 @@
+<resources>
+
+    <string name="pickerview_cancel">Cancel</string>
+    <string name="pickerview_submit">Confirm</string>
+    <string name="pickerview_year"> </string>
+    <string name="pickerview_month"> </string>
+    <string name="pickerview_day"> </string>
+    <string name="pickerview_hours"> </string>
+    <string name="pickerview_minutes"> </string>
+    <string name="pickerview_seconds"> </string>
+</resources>

+ 13 - 0
pickerview/src/main/res/values/dimens.xml

@@ -0,0 +1,13 @@
+<resources>
+    <!-- 顶部按钮栏高度 -->
+    <dimen name="pickerview_topbar_height">44dp</dimen>
+
+    <!-- 顶部按钮padding -->
+    <dimen name="pickerview_topbar_padding">20dp</dimen>
+
+    <!-- 顶部按钮文字大小 -->
+    <dimen name="pickerview_topbar_btn_textsize">17sp</dimen>
+    <dimen name="pickerview_topbar_title_textsize">18sp</dimen>
+    <!-- 选项文字大小 -->
+    <dimen name="pickerview_textsize">20sp</dimen>
+</resources>

+ 5 - 0
pickerview/src/main/res/values/integers.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+  <integer name="animation_default_duration">300</integer>
+</resources>

+ 11 - 0
pickerview/src/main/res/values/strings.xml

@@ -0,0 +1,11 @@
+<resources>
+
+    <string name="pickerview_cancel">取消</string>
+    <string name="pickerview_submit">确定</string>
+    <string name="pickerview_year">年</string>
+    <string name="pickerview_month">月</string>
+    <string name="pickerview_day">日</string>
+    <string name="pickerview_hours">时</string>
+    <string name="pickerview_minutes">分</string>
+    <string name="pickerview_seconds">秒</string>
+</resources>

+ 31 - 0
pickerview/src/main/res/values/styles.xml

@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <style name="custom_dialog2" parent="@android:style/Theme.Dialog">
+        <item name="android:windowFrame">@null</item>
+        <!-- Dialog的windowFrame框为无 -->
+        <item name="android:windowIsFloating">true</item>
+        <!-- 是否漂现在activity上 -->
+        <item name="android:windowIsTranslucent">true</item>
+        <!-- 是否半透明 -->
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:background">@null</item>
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <!-- 去除黑色边框的关键设置项 -->
+        <item name="android:backgroundDimEnabled">true</item>
+        <!-- 屏幕背景是否变暗 -->
+        <item name="android:backgroundDimAmount">0.3</item>
+    </style>
+
+    <style name="picker_view_scale_anim" mce_bogus="1" parent="android:Animation">
+        <item name="android:windowEnterAnimation">@anim/pickerview_dialog_scale_in</item>
+        <item name="android:windowExitAnimation">@anim/pickerview_dialog_scale_out</item>
+    </style>
+
+
+    <style name="picker_view_slide_anim" mce_bogus="1" parent="android:Animation">
+        <item name="android:windowEnterAnimation">@anim/pickerview_slide_in_bottom</item>
+        <item name="android:windowExitAnimation">@anim/pickerview_slide_out_bottom</item>
+    </style>
+
+</resources>

+ 2 - 0
settings.gradle

@@ -85,3 +85,5 @@ include ':classRoom'
 include ':institution'
 include ':musicMerge'
 include ':accompany'
+include ':pickerview'
+include ':wheelview'

+ 6 - 0
student/src/main/AndroidManifest.xml

@@ -248,6 +248,12 @@
             android:name=".ui.mine.FeedBackActivity"
             android:configChanges="orientation|screenSize|keyboardHidden|fontScale|smallestScreenSize|screenLayout|uiMode"
             android:screenOrientation="portrait" />
+
+
+        <activity
+            android:name=".ui.course.AppointmentCourseActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden|fontScale|smallestScreenSize|screenLayout|uiMode"
+            android:screenOrientation="portrait" />
         <!--        分享开始-->
         <activity
             android:name=".wxapi.WXEntryActivity"

+ 8 - 0
student/src/main/java/com/cooleshow/student/bean/QuerySubjectBean.java

@@ -58,6 +58,14 @@ public class QuerySubjectBean implements IPickerViewData {
     public List<QuerySubjectBean> subjects;
     public String updateTime;
 
+    public String getId() {
+        return String.valueOf(id);
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
     @Override
     public String getPickerViewText() {
         return name;

+ 17 - 0
student/src/main/java/com/cooleshow/student/contract/InterestCorrectionCourseListContract.java

@@ -0,0 +1,17 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface InterestCorrectionCourseListContract {
+
+    interface View extends BaseView {
+
+    }
+
+    interface Presenter {
+        void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page);
+    }
+}

+ 17 - 0
student/src/main/java/com/cooleshow/student/contract/LiveCourseAppointListContract.java

@@ -0,0 +1,17 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface LiveCourseAppointListContract {
+
+    interface View extends BaseView {
+
+    }
+
+    interface Presenter {
+        void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page);
+    }
+}

+ 18 - 0
student/src/main/java/com/cooleshow/student/contract/VIPCustomCourseListContract.java

@@ -0,0 +1,18 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.student.bean.SelectMyGroupBean;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface VIPCustomCourseListContract {
+
+    interface VIPCustomCourseView extends BaseView {
+
+    }
+
+    interface Presenter {
+        void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page);
+    }
+}

+ 17 - 0
student/src/main/java/com/cooleshow/student/contract/VideoCourseAppointListContract.java

@@ -0,0 +1,17 @@
+package com.cooleshow.student.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface VideoCourseAppointListContract {
+
+    interface View extends BaseView {
+
+    }
+
+    interface Presenter {
+        void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page);
+    }
+}

+ 56 - 0
student/src/main/java/com/cooleshow/student/presenter/course/InterestCorrectionCourseListPresenter.java

@@ -0,0 +1,56 @@
+package com.cooleshow.student.presenter.course;
+
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.SelectMyGroupBean;
+import com.cooleshow.student.contract.InterestCorrectionCourseListContract;
+import com.cooleshow.student.contract.VIPCustomCourseListContract;
+import com.cooleshow.student.contract.VideoCourseContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class InterestCorrectionCourseListPresenter extends BasePresenter<InterestCorrectionCourseListContract.View> implements InterestCorrectionCourseListContract.Presenter {
+
+    @Override
+    public void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            if (subjectId != 0) {
+                jsonObject.putOpt("subjectId", subjectId);
+            }
+            jsonObject.putOpt("platform", "android");
+            jsonObject.putOpt("version", "1");
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).selectMyGroup(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<SelectMyGroupBean>(getView()) {
+            @Override
+            protected void onSuccess(SelectMyGroupBean data) {
+                if (getView() != null) {
+//                    getView().onGetVideoCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+//                    getView().onGetCourseError(page);
+                }
+            }
+        });
+    }
+}

+ 55 - 0
student/src/main/java/com/cooleshow/student/presenter/course/LiveCourseAppointListPresenter.java

@@ -0,0 +1,55 @@
+package com.cooleshow.student.presenter.course;
+
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.SelectMyGroupBean;
+import com.cooleshow.student.contract.InterestCorrectionCourseListContract;
+import com.cooleshow.student.contract.LiveCourseAppointListContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class LiveCourseAppointListPresenter extends BasePresenter<LiveCourseAppointListContract.View> implements LiveCourseAppointListContract.Presenter {
+
+    @Override
+    public void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            if (subjectId != 0) {
+                jsonObject.putOpt("subjectId", subjectId);
+            }
+            jsonObject.putOpt("platform", "android");
+            jsonObject.putOpt("version", "1");
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).selectMyGroup(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<SelectMyGroupBean>(getView()) {
+            @Override
+            protected void onSuccess(SelectMyGroupBean data) {
+                if (getView() != null) {
+//                    getView().onGetVideoCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+//                    getView().onGetCourseError(page);
+                }
+            }
+        });
+    }
+}

+ 55 - 0
student/src/main/java/com/cooleshow/student/presenter/course/VIPCustomCourseListPresenter.java

@@ -0,0 +1,55 @@
+package com.cooleshow.student.presenter.course;
+
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.SelectMyGroupBean;
+import com.cooleshow.student.contract.VIPCustomCourseListContract;
+import com.cooleshow.student.contract.VideoCourseContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class VIPCustomCourseListPresenter extends BasePresenter<VIPCustomCourseListContract.VIPCustomCourseView> implements VIPCustomCourseListContract.Presenter {
+
+    @Override
+    public void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            if (subjectId != 0) {
+                jsonObject.putOpt("subjectId", subjectId);
+            }
+            jsonObject.putOpt("platform", "android");
+            jsonObject.putOpt("version", "1");
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).selectMyGroup(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<SelectMyGroupBean>(getView()) {
+            @Override
+            protected void onSuccess(SelectMyGroupBean data) {
+                if (getView() != null) {
+//                    getView().onGetVideoCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+//                    getView().onGetCourseError(page);
+                }
+            }
+        });
+    }
+}

+ 55 - 0
student/src/main/java/com/cooleshow/student/presenter/course/VideoCourseAppointListPresenter.java

@@ -0,0 +1,55 @@
+package com.cooleshow.student.presenter.course;
+
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.student.api.APIService;
+import com.cooleshow.student.bean.SelectMyGroupBean;
+import com.cooleshow.student.contract.LiveCourseAppointListContract;
+import com.cooleshow.student.contract.VideoCourseAppointListContract;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * 陪练课presenter
+ * Author by pq, Date on 2022/4/20.
+ */
+public class VideoCourseAppointListPresenter extends BasePresenter<VideoCourseAppointListContract.View> implements VideoCourseAppointListContract.Presenter {
+
+    @Override
+    public void queryVideoCourse(boolean isShowLoading, String studentId,int subjectId, int page) {
+        if (isShowLoading && getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            if (subjectId != 0) {
+                jsonObject.putOpt("subjectId", subjectId);
+            }
+            jsonObject.putOpt("platform", "android");
+            jsonObject.putOpt("version", "1");
+            jsonObject.putOpt("page", page);
+            jsonObject.putOpt("rows", Constants.DEFAULT_DATA_SIZE);
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        addSubscribe(create(APIService.class).selectMyGroup(RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<SelectMyGroupBean>(getView()) {
+            @Override
+            protected void onSuccess(SelectMyGroupBean data) {
+                if (getView() != null) {
+//                    getView().onGetVideoCourseSuccess(page, data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+                if (getView() != null) {
+//                    getView().onGetCourseError(page);
+                }
+            }
+        });
+    }
+}

+ 147 - 0
student/src/main/java/com/cooleshow/student/ui/course/AppointmentCourseActivity.java

@@ -0,0 +1,147 @@
+package com.cooleshow.student.ui.course;
+
+import android.os.Bundle;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.student.adapter.MineCoursePagerAdapter;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.contract.MineCourseContract;
+import com.cooleshow.student.databinding.ActivityMineCourseBinding;
+import com.cooleshow.student.presenter.course.MineCoursePresenter;
+import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import androidx.annotation.Nullable;
+import androidx.viewpager2.widget.ViewPager2;
+
+
+/**
+ * 创建日期:2022/5/30 9:21
+ *  约课
+ * @author Ryan
+ * 类说明:
+ */
+@Route(path = RouterPath.CourseCenter.APPOINTMENT_COURSE)
+public class AppointmentCourseActivity extends BaseMVPActivity<ActivityMineCourseBinding, MineCoursePresenter> implements MineCourseContract.MineCourseView {
+    public static final String SELECT_POSITION = "selectPosition";
+    private TabLayout tabLayout;
+    private ViewPager2 viewPager;
+    private ArrayList<String> titles = null;
+    private ArrayList<BaseMVPFragment> fragments = new ArrayList<>();
+    private VIPCustomCourseListFragment mVipCustomCourseListFragment;
+    private InterestCorrectionCourseListFragment mInterestCorrectionCourseListFragment;
+    private LiveCourseAppointListFragment mLiveCourseAppointListFragment;
+    private VideoCourseAppointListFragment mVideoCourseAppointListFragment;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "约课");
+        tabLayout = viewBinding.tablayout;
+        viewPager = viewBinding.viewpager;
+        viewPager.setCurrentItem(0);
+
+    }
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
+
+    @Override
+    protected ActivityMineCourseBinding getLayoutView() {
+        return ActivityMineCourseBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected MineCoursePresenter createPresenter() {
+        return new MineCoursePresenter();
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        int selectPosition = getIntent().getIntExtra(SELECT_POSITION, -1);
+        titles = new ArrayList<String>(Arrays.asList("VIP定制课","越纠课", "直播课", "视频课"));
+        initTabLayoutAndViewPager();
+        presenter.querySubjectItem();
+        if (selectPosition != -1 && selectPosition < fragments.size()) {
+            viewPager.post(new Runnable() {
+                @Override
+                public void run() {
+                    viewPager.setCurrentItem(selectPosition);
+                }
+            });
+        }
+    }
+
+    private void initTabLayoutAndViewPager() {
+        mVipCustomCourseListFragment = VIPCustomCourseListFragment.newInstance();
+        mInterestCorrectionCourseListFragment = InterestCorrectionCourseListFragment.newInstance();
+        mLiveCourseAppointListFragment = LiveCourseAppointListFragment.newInstance();
+        mVideoCourseAppointListFragment = VideoCourseAppointListFragment.newInstance();
+        fragments.add(mVipCustomCourseListFragment);
+        fragments.add(mInterestCorrectionCourseListFragment);
+        fragments.add(mLiveCourseAppointListFragment);
+        fragments.add(mVideoCourseAppointListFragment);
+        MineCoursePagerAdapter mineCoursePageAdapter = new MineCoursePagerAdapter(this);
+        mineCoursePageAdapter.setFragments(fragments);
+        viewPager.setAdapter(mineCoursePageAdapter);
+        new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
+            //这里需要根据position修改tab的样式和文字等
+            tab.setText(titles.get(position));
+            tab.select();
+        }).attach();
+        viewPager.setOffscreenPageLimit(fragments.size());
+
+        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            @Override
+            public void onTabSelected(TabLayout.Tab tab) {
+                viewPager.setCurrentItem(tab.getPosition());
+            }
+
+            @Override
+            public void onTabUnselected(TabLayout.Tab tab) {
+
+            }
+
+            @Override
+            public void onTabReselected(TabLayout.Tab tab) {
+
+            }
+        });
+
+        viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
+            @Override
+            public void onPageSelected(int position) {
+                super.onPageSelected(position);
+                BaseMVPFragment fragment = fragments.get(position);
+                fragment.refreshData();
+            }
+        });
+    }
+
+    @Override
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        if (mVipCustomCourseListFragment != null) {
+            mVipCustomCourseListFragment.querySubjectItemSuccess(data);
+        }
+        if (mInterestCorrectionCourseListFragment != null) {
+            mInterestCorrectionCourseListFragment.querySubjectItemSuccess(data);
+        }
+        if (mLiveCourseAppointListFragment != null) {
+            mLiveCourseAppointListFragment.querySubjectItemSuccess(data);
+        }
+        if (mVideoCourseAppointListFragment != null) {
+            mVideoCourseAppointListFragment.querySubjectItemSuccess(data);
+        }
+    }
+}

+ 55 - 0
student/src/main/java/com/cooleshow/student/ui/course/InterestCorrectionCourseListFragment.java

@@ -0,0 +1,55 @@
+package com.cooleshow.student.ui.course;
+
+import android.view.View;
+
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.contract.InterestCorrectionCourseListContract;
+import com.cooleshow.student.databinding.FgInterestCorrectionCourseListLayoutBinding;
+import com.cooleshow.student.databinding.FgVipCustomCourseListLayoutBinding;
+import com.cooleshow.student.presenter.course.InterestCorrectionCourseListPresenter;
+import com.cooleshow.student.presenter.course.VIPCustomCourseListPresenter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2024/11/13.
+ * 趣纠课约课
+ */
+public class InterestCorrectionCourseListFragment extends BaseMVPFragment<FgInterestCorrectionCourseListLayoutBinding, InterestCorrectionCourseListPresenter> implements InterestCorrectionCourseListContract.View {
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
+
+
+    public static InterestCorrectionCourseListFragment newInstance() {
+        InterestCorrectionCourseListFragment fragment = new InterestCorrectionCourseListFragment();
+        return fragment;
+    }
+
+    @Override
+    protected FgInterestCorrectionCourseListLayoutBinding getLayoutView() {
+        return FgInterestCorrectionCourseListLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    @Override
+    protected InterestCorrectionCourseListPresenter createPresenter() {
+        return new InterestCorrectionCourseListPresenter();
+    }
+
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        subjectBeanList.addAll(data);
+    }
+
+}

+ 54 - 0
student/src/main/java/com/cooleshow/student/ui/course/LiveCourseAppointListFragment.java

@@ -0,0 +1,54 @@
+package com.cooleshow.student.ui.course;
+
+import android.view.View;
+
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.contract.InterestCorrectionCourseListContract;
+import com.cooleshow.student.contract.LiveCourseAppointListContract;
+import com.cooleshow.student.databinding.FgInterestCorrectionCourseListLayoutBinding;
+import com.cooleshow.student.databinding.FgLiveCourseAppointListLayoutBinding;
+import com.cooleshow.student.presenter.course.InterestCorrectionCourseListPresenter;
+import com.cooleshow.student.presenter.course.LiveCourseAppointListPresenter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2024/11/13.
+ * 直播课约课
+ */
+public class LiveCourseAppointListFragment extends BaseMVPFragment<FgLiveCourseAppointListLayoutBinding, LiveCourseAppointListPresenter> implements LiveCourseAppointListContract.View {
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
+
+    public static LiveCourseAppointListFragment newInstance() {
+        LiveCourseAppointListFragment fragment = new LiveCourseAppointListFragment();
+        return fragment;
+    }
+
+    @Override
+    protected FgLiveCourseAppointListLayoutBinding getLayoutView() {
+        return FgLiveCourseAppointListLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    @Override
+    protected LiveCourseAppointListPresenter createPresenter() {
+        return new LiveCourseAppointListPresenter();
+    }
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        subjectBeanList.addAll(data);
+    }
+
+}

+ 14 - 4
student/src/main/java/com/cooleshow/student/ui/course/LiveCourseFragment.java

@@ -1,6 +1,7 @@
 package com.cooleshow.student.ui.course;
 
 import android.annotation.SuppressLint;
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -262,7 +263,10 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
                         });
                         ivCancel.setOnClickListener(v1 -> pvTime.dismiss());
 
-                    }).setLineSpacingMultiplier(2.5f)
+                    }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
+                    .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
                     .isDialog(false)//是否显示为对话框样式
@@ -274,6 +278,11 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
                 public void onDismiss(Object o) {
                     UiUtils.refreshFilterTextStyle2(false, mViewBinding.tvTime);
                 }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
+                }
             });
         }
         Calendar calendar = Calendar.getInstance();
@@ -281,7 +290,6 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         pvTime.setDate(calendar);
         if (!pvTime.isShowing()) {
             pvTime.show();
-            UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
         }
     }
 
@@ -359,7 +367,7 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
             currentSubjectId = subjectBeanList.get(options1).id;
             mViewBinding.tvAgency.setText(subjectBeanList.get(options1).name);
             queryCourse(true);
-        }).setLayoutRes(R.layout.pickerview_address_layout, v -> {
+        }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_address_layout, v -> {
             //自定义布局中的控件初始化及事件处理
             final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
             TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
@@ -369,7 +377,9 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
             });
             ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-        }).isDialog(false).build();
+        }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT).isDialog(false).build();
         pvOptions.setPicker(subjectBeanList);
         pvOptions.show();
 

+ 14 - 4
student/src/main/java/com/cooleshow/student/ui/course/MinePracticeCourseFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.student.ui.course;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -310,7 +311,10 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
                         });
                         ivCancel.setOnClickListener(v1 -> pvTime.dismiss());
 
-                    }).setLineSpacingMultiplier(2.5f)
+                    }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
+                    .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
                     .isDialog(false)//是否显示为对话框样式
@@ -322,6 +326,11 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
                 public void onDismiss(Object o) {
                     UiUtils.refreshFilterTextStyle2(false, mViewBinding.tvTime);
                 }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
+                }
             });
         }
         Calendar calendar = Calendar.getInstance();
@@ -329,7 +338,6 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
         pvTime.setDate(calendar);
         if (!pvTime.isShowing()) {
             pvTime.show();
-            UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
         }
     }
 
@@ -355,7 +363,7 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
             currentSubjectId = subjectBeanList.get(options1).id;
             mViewBinding.tvAgency.setText(subjectBeanList.get(options1).name);
             queryCourse(true);
-        }).setLayoutRes(R.layout.pickerview_address_layout, v -> {
+        }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_address_layout, v -> {
             //自定义布局中的控件初始化及事件处理
             final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
             TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
@@ -365,7 +373,9 @@ public class MinePracticeCourseFragment extends BaseMVPFragment<FragmentPractice
             });
             ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-        }).isDialog(false).build();
+        }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT).isDialog(false).build();
         pvOptions.setPicker(subjectBeanList);
         pvOptions.show();
 

+ 9 - 1
student/src/main/java/com/cooleshow/student/ui/course/PianoRoomCourseFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.student.ui.course;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.PopupWindow;
@@ -246,6 +247,9 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
                         ivCancel.setOnClickListener(v12 -> pvTime.dismiss());
 
                     })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
@@ -258,6 +262,11 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
                 public void onDismiss(Object o) {
                     UiUtils.refreshFilterTextStyle2(false, mViewBinding.tvTime);
                 }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
+                }
             });
         }
         Calendar calendar = Calendar.getInstance();
@@ -265,7 +274,6 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
         pvTime.setDate(calendar);
         if (!pvTime.isShowing()) {
             pvTime.show();
-            UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
         }
     }
 

+ 123 - 0
student/src/main/java/com/cooleshow/student/ui/course/VIPCustomCourseListFragment.java

@@ -0,0 +1,123 @@
+package com.cooleshow.student.ui.course;
+
+import android.graphics.Color;
+import android.view.View;
+import android.widget.TextView;
+
+import com.bigkoo.pickerview.builder.OptionsPickerBuilder;
+import com.bigkoo.pickerview.listener.OnDismissListener;
+import com.bigkoo.pickerview.view.OptionsPickerView;
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.student.R;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.databinding.FgVipCustomCourseListLayoutBinding;
+import com.cooleshow.student.presenter.course.VIPCustomCourseListPresenter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2024/11/13.
+ * VIP定制课约课
+ */
+public class VIPCustomCourseListFragment extends BaseMVPFragment<FgVipCustomCourseListLayoutBinding, VIPCustomCourseListPresenter> implements View.OnClickListener {
+    private List<QuerySubjectBean> subjectList = new ArrayList<>();
+    private OptionsPickerView pvOptions;
+    private int currentSelectSubjectPosition = -1;
+    private String currentSubjectId;
+    private int currentPage =1;
+
+    public static VIPCustomCourseListFragment newInstance() {
+        VIPCustomCourseListFragment fragment = new VIPCustomCourseListFragment();
+        return fragment;
+    }
+
+    @Override
+    protected FgVipCustomCourseListLayoutBinding getLayoutView() {
+        return FgVipCustomCourseListLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+    }
+
+    @Override
+    protected void initData() {
+        initListener();
+    }
+
+    private void initListener(){
+        mViewBinding.tvFilter.setOnClickListener(this);
+    }
+
+    @Override
+    protected VIPCustomCourseListPresenter createPresenter() {
+        return new VIPCustomCourseListPresenter();
+    }
+
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectList.clear();
+        subjectList.add(new QuerySubjectBean("全部声部", 0));
+        subjectList.addAll(data);
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if(id == R.id.tv_filter){
+            selectSubjectType();
+            return;
+        }
+    }
+
+    private void selectSubjectType() {
+        if (subjectList.size() <= 0) {
+            return;
+        }
+        if(pvOptions == null){
+            pvOptions = new OptionsPickerBuilder(getContext(), (options1, options2, options3, v) -> {
+                this.currentSelectSubjectPosition = options1;
+                QuerySubjectBean subjectBean = subjectList.get(options1);
+                this.currentSubjectId = subjectBean.getId();
+                mViewBinding.tvFilter.setText(subjectBean.getPickerViewText());
+                currentPage = 1;
+                getData(true);
+            }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_select_options_layout, v -> {
+                        //自定义布局中的控件初始化及事件处理
+                        final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
+                        TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
+                        tvSubmit.setOnClickListener(v12 -> {
+                            pvOptions.returnData();
+                            pvOptions.dismiss();
+                        });
+                        ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
+
+                    }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT).isDialog(false).build();
+            pvOptions.setOnDismissListener(new OnDismissListener() {
+                @Override
+                public void onDismiss(Object o) {
+                    UiUtils.refreshFilterTextStyle(false, mViewBinding.tvFilter);
+                }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle(true, mViewBinding.tvFilter);
+                }
+            });
+        }
+        pvOptions.setPicker(subjectList);
+        if (currentSelectSubjectPosition != -1 && currentSelectSubjectPosition < subjectList.size()) {
+            pvOptions.setSelectOptions(currentSelectSubjectPosition);
+        }
+        pvOptions.show();
+
+    }
+
+    private void getData(boolean isShowLoading) {
+
+    }
+}

+ 53 - 0
student/src/main/java/com/cooleshow/student/ui/course/VideoCourseAppointListFragment.java

@@ -0,0 +1,53 @@
+package com.cooleshow.student.ui.course;
+
+import android.view.View;
+
+import com.cooleshow.base.ui.fragment.BaseMVPFragment;
+import com.cooleshow.student.bean.QuerySubjectBean;
+import com.cooleshow.student.contract.LiveCourseAppointListContract;
+import com.cooleshow.student.contract.VideoCourseAppointListContract;
+import com.cooleshow.student.databinding.FgLiveCourseAppointListLayoutBinding;
+import com.cooleshow.student.databinding.FgVideoCourseAppointListLayoutBinding;
+import com.cooleshow.student.presenter.course.LiveCourseAppointListPresenter;
+import com.cooleshow.student.presenter.course.VideoCourseAppointListPresenter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Author by pq, Date on 2024/11/13.
+ * 视频课约课
+ */
+public class VideoCourseAppointListFragment extends BaseMVPFragment<FgVideoCourseAppointListLayoutBinding, VideoCourseAppointListPresenter> implements VideoCourseAppointListContract.View {
+    private List<QuerySubjectBean> subjectBeanList = new ArrayList<>();
+    public static VideoCourseAppointListFragment newInstance() {
+        VideoCourseAppointListFragment fragment = new VideoCourseAppointListFragment();
+        return fragment;
+    }
+
+    @Override
+    protected FgVideoCourseAppointListLayoutBinding getLayoutView() {
+        return FgVideoCourseAppointListLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected void initView(View rootView) {
+
+    }
+
+    @Override
+    protected void initData() {
+
+    }
+
+    @Override
+    protected VideoCourseAppointListPresenter createPresenter() {
+        return new VideoCourseAppointListPresenter();
+    }
+
+    public void querySubjectItemSuccess(List<QuerySubjectBean> data) {
+        subjectBeanList.clear();
+        subjectBeanList.add(new QuerySubjectBean("全部声部", 0));
+        subjectBeanList.addAll(data);
+    }
+}

+ 5 - 2
student/src/main/java/com/cooleshow/student/ui/course/VideoCourseFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.student.ui.course;
 
+import android.graphics.Color;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.PopupWindow;
@@ -279,7 +280,7 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
             currentSubjectId = subjectBeanList.get(options1).id;
             mViewBinding.tvSubject.setText(subjectBeanList.get(options1).name);
             queryCourse(true);
-        }).setLayoutRes(R.layout.pickerview_address_layout, v -> {
+        }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_address_layout, v -> {
                     //自定义布局中的控件初始化及事件处理
                     final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
                     TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
@@ -289,7 +290,9 @@ public class VideoCourseFragment extends BaseMVPFragment<FragmentVideoCourseLayo
                     });
                     ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-                }).isDialog(false)
+                }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT).isDialog(false)
                 .build();
         pvOptions.setPicker(subjectBeanList);
         pvOptions.show();

+ 2 - 0
student/src/main/java/com/cooleshow/student/ui/main/MusicHallFragment.java

@@ -141,6 +141,8 @@ public class MusicHallFragment extends BaseMVPFragment<FgMusicHallLayoutBinding,
         if (id == R.id.view_search_bg) {
             //搜索
             WebStartHelper.startSearch();
+            ARouter.getInstance().build(RouterPath.CourseCenter.APPOINTMENT_COURSE)
+                    .navigation();
             return;
         }
         if (id == R.id.tv_hot_album_more) {

+ 4 - 0
student/src/main/java/com/cooleshow/student/ui/mine/PersonalSettingActivity.java

@@ -2,6 +2,7 @@ package com.cooleshow.student.ui.mine;
 
 import android.Manifest;
 import android.content.Intent;
+import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Build;
@@ -186,6 +187,9 @@ public class PersonalSettingActivity extends BaseMVPActivity<ActivityPersonalSet
 
                     }
                 })
+                .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT)
                 .setLineSpacingMultiplier(2.5f)
                 .setType(new boolean[]{true, true, true, false, false, false})// 默认全部显示
                 .isCyclic(true)//是否循环滚动

+ 4 - 0
student/src/main/java/com/cooleshow/student/ui/work/HomeWorkFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.student.ui.work;
 
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -237,6 +238,9 @@ public class HomeWorkFragment extends BaseMVPFragment<FragmentHomeworkBinding, H
 
                 }
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 38 - 0
student/src/main/res/layout/activity_appointment_course.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <include
+        android:id="@+id/toolbar_include"
+        layout="@layout/common_toolbar_layout" />
+
+    <com.google.android.material.tabs.TabLayout
+        android:id="@+id/tablayout"
+        android:background="@color/white"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_44"
+        android:scrollbars="none"
+        app:tabBackground="@null"
+        app:tabGravity="fill"
+        app:tabIndicator="@drawable/tab_indicator"
+        app:tabIndicatorColor="@color/color_2dc7aa"
+        app:tabIndicatorFullWidth="false"
+        app:tabIndicatorHeight="4dp"
+        app:tabMode="fixed"
+        app:tabRippleColor="@null"
+        app:tabSelectedTextColor="@color/black_333"
+        app:tabTextAppearance="@style/tab_layout_style"
+        app:tabTextColor="@color/color_666666" />
+
+
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/viewpager"
+        android:layout_width="match_parent"
+        android:overScrollMode="never"
+        android:layout_height="0dp"
+        android:layout_weight="1" />
+</LinearLayout>

+ 146 - 0
student/src/main/res/layout/fg_interest_correction_course_list_layout.xml

@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/tv_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:drawableRight="@drawable/icon_arrow_down"
+        android:drawablePadding="6dp"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:maxLength="6"
+        android:maxLines="1"
+        android:paddingStart="13dp"
+        android:paddingEnd="8dp"
+        android:text="筛选"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <View
+        android:id="@+id/view_search_bg"
+        android:layout_width="0dp"
+        android:layout_height="34dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/bg_white_18dp"
+        app:layout_constraintLeft_toRightOf="@+id/tv_filter"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_search_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:src="@drawable/icon_search"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <com.cooleshow.base.widgets.ClearEditText
+        android:id="@+id/et_target_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="5dp"
+        android:background="@null"
+        android:ellipsize="end"
+        android:hint="搜索你喜欢的老师"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:paddingStart="8dp"
+        android:textColor="@color/color_999999"
+        android:textCursorDrawable="@drawable/shape_2dc7aa_1dp"
+        android:textSize="@dimen/sp_14"
+        android:theme="@style/MyEditText"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toRightOf="@+id/iv_search_icon"
+        app:layout_constraintRight_toLeftOf="@+id/tv_search"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <TextView
+        android:id="@+id/tv_search"
+        android:layout_width="56dp"
+        android:layout_height="28dp"
+        android:layout_marginEnd="3dp"
+        android:background="@drawable/shape_1ecdac_18dp"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:text="搜索"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <RadioGroup
+        android:id="@+id/rg_filter"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:orientation="horizontal"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_search_bg">
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="仅看未来30天有空" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="已上课时" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="课时单价" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="评分" />
+    </RadioGroup>
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/rg_filter"
+        app:srlEnableLoadMore="false">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/liv_letters"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/view_search_bg"
+            app:layout_constraintVertical_bias="0.0" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 146 - 0
student/src/main/res/layout/fg_live_course_appoint_list_layout.xml

@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/tv_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:drawableRight="@drawable/icon_arrow_down"
+        android:drawablePadding="6dp"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:maxLength="6"
+        android:maxLines="1"
+        android:paddingStart="13dp"
+        android:paddingEnd="8dp"
+        android:text="筛选"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <View
+        android:id="@+id/view_search_bg"
+        android:layout_width="0dp"
+        android:layout_height="34dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/bg_white_18dp"
+        app:layout_constraintLeft_toRightOf="@+id/tv_filter"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_search_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:src="@drawable/icon_search"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <com.cooleshow.base.widgets.ClearEditText
+        android:id="@+id/et_target_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="5dp"
+        android:background="@null"
+        android:ellipsize="end"
+        android:hint="搜索你喜欢的老师"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:paddingStart="8dp"
+        android:textColor="@color/color_999999"
+        android:textCursorDrawable="@drawable/shape_2dc7aa_1dp"
+        android:textSize="@dimen/sp_14"
+        android:theme="@style/MyEditText"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toRightOf="@+id/iv_search_icon"
+        app:layout_constraintRight_toLeftOf="@+id/tv_search"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <TextView
+        android:id="@+id/tv_search"
+        android:layout_width="56dp"
+        android:layout_height="28dp"
+        android:layout_marginEnd="3dp"
+        android:background="@drawable/shape_1ecdac_18dp"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:text="搜索"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <RadioGroup
+        android:id="@+id/rg_filter"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:orientation="horizontal"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_search_bg">
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="仅看未来30天有空" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="已上课时" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="课时单价" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="评分" />
+    </RadioGroup>
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/rg_filter"
+        app:srlEnableLoadMore="false">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/liv_letters"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/view_search_bg"
+            app:layout_constraintVertical_bias="0.0" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 146 - 0
student/src/main/res/layout/fg_video_course_appoint_list_layout.xml

@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/tv_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:drawableRight="@drawable/icon_arrow_down"
+        android:drawablePadding="6dp"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:maxLength="6"
+        android:maxLines="1"
+        android:paddingStart="13dp"
+        android:paddingEnd="8dp"
+        android:text="筛选"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <View
+        android:id="@+id/view_search_bg"
+        android:layout_width="0dp"
+        android:layout_height="34dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/bg_white_18dp"
+        app:layout_constraintLeft_toRightOf="@+id/tv_filter"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_search_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:src="@drawable/icon_search"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <com.cooleshow.base.widgets.ClearEditText
+        android:id="@+id/et_target_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="5dp"
+        android:background="@null"
+        android:ellipsize="end"
+        android:hint="搜索你喜欢的老师"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:paddingStart="8dp"
+        android:textColor="@color/color_999999"
+        android:textCursorDrawable="@drawable/shape_2dc7aa_1dp"
+        android:textSize="@dimen/sp_14"
+        android:theme="@style/MyEditText"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toRightOf="@+id/iv_search_icon"
+        app:layout_constraintRight_toLeftOf="@+id/tv_search"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <TextView
+        android:id="@+id/tv_search"
+        android:layout_width="56dp"
+        android:layout_height="28dp"
+        android:layout_marginEnd="3dp"
+        android:background="@drawable/shape_1ecdac_18dp"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:text="搜索"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <RadioGroup
+        android:id="@+id/rg_filter"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:orientation="horizontal"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_search_bg">
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="仅看未来30天有空" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="已上课时" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="课时单价" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="评分" />
+    </RadioGroup>
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/rg_filter"
+        app:srlEnableLoadMore="false">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/liv_letters"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/view_search_bg"
+            app:layout_constraintVertical_bias="0.0" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 146 - 0
student/src/main/res/layout/fg_vip_custom_course_list_layout.xml

@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/tv_filter"
+        android:layout_width="wrap_content"
+        android:layout_height="0dp"
+        android:drawableRight="@drawable/icon_arrow_down"
+        android:drawablePadding="6dp"
+        android:ellipsize="end"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:maxLength="6"
+        android:maxLines="1"
+        android:paddingStart="13dp"
+        android:paddingEnd="8dp"
+        android:text="筛选"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <View
+        android:id="@+id/view_search_bg"
+        android:layout_width="0dp"
+        android:layout_height="34dp"
+        android:layout_marginEnd="14dp"
+        android:background="@drawable/bg_white_18dp"
+        app:layout_constraintLeft_toRightOf="@+id/tv_filter"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <ImageView
+        android:id="@+id/iv_search_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="12dp"
+        android:src="@drawable/icon_search"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toLeftOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <com.cooleshow.base.widgets.ClearEditText
+        android:id="@+id/et_target_name"
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="5dp"
+        android:background="@null"
+        android:ellipsize="end"
+        android:hint="搜索你喜欢的老师"
+        android:includeFontPadding="false"
+        android:maxLines="1"
+        android:paddingStart="8dp"
+        android:textColor="@color/color_999999"
+        android:textCursorDrawable="@drawable/shape_2dc7aa_1dp"
+        android:textSize="@dimen/sp_14"
+        android:theme="@style/MyEditText"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintLeft_toRightOf="@+id/iv_search_icon"
+        app:layout_constraintRight_toLeftOf="@+id/tv_search"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <TextView
+        android:id="@+id/tv_search"
+        android:layout_width="56dp"
+        android:layout_height="28dp"
+        android:layout_marginEnd="3dp"
+        android:background="@drawable/shape_1ecdac_18dp"
+        android:gravity="center"
+        android:includeFontPadding="false"
+        android:text="搜索"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintBottom_toBottomOf="@+id/view_search_bg"
+        app:layout_constraintRight_toRightOf="@+id/view_search_bg"
+        app:layout_constraintTop_toTopOf="@+id/view_search_bg" />
+
+    <RadioGroup
+        android:id="@+id/rg_filter"
+        android:layout_width="match_parent"
+        android:layout_height="40dp"
+        android:orientation="horizontal"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_search_bg">
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="仅看未来30天有空" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="已上课时" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="课时单价" />
+
+        <RadioButton
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:button="@null"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:text="评分" />
+    </RadioGroup>
+
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/rg_filter"
+        app:srlEnableLoadMore="false">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:overScrollMode="never"
+            android:scrollbars="none"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toStartOf="@id/liv_letters"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/view_search_bg"
+            app:layout_constraintVertical_bias="0.0" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 76
student/src/main/res/layout/pickerview_address_layout.xml

@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@drawable/bg_white_top_10dp"
-    android:orientation="vertical">
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="50dp">
-
-
-        <TextView
-            android:id="@+id/tv_cancel"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
-            android:text="取消"
-            android:textColor="@color/color_999999"
-            android:textSize="@dimen/dp_16" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerInParent="true"
-            android:text=""
-            android:textColor="@color/color_1a1a1a"
-            android:textSize="18dp" />
-
-        <TextView
-            android:id="@+id/tv_finish"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentRight="true"
-            android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
-            android:text="确定"
-            android:textColor="@color/colorPrimary"
-            android:textSize="@dimen/dp_16" />
-
-    </RelativeLayout>
-
-    <View style="@style/line_style" />
-    <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
-    <LinearLayout
-        android:id="@+id/optionspicker"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="#ffffff"
-        android:gravity="center"
-        android:minHeight="150dp"
-        android:orientation="horizontal">
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options1"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options2"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options3"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-    </LinearLayout>
-
-
-</LinearLayout>

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/comment/CourseCommentHasReplyFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.comment;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.ImageView;
@@ -161,6 +162,9 @@ public class CourseCommentHasReplyFragment extends BaseMVPFragment<FragmentCours
                 ivCancel.setOnClickListener(v12 -> pvTime.dismiss());
 
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/comment/CourseCommentNoReplyFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.comment;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.ImageView;
@@ -172,6 +173,9 @@ public class CourseCommentNoReplyFragment extends BaseMVPFragment<FragmentCourse
 
                 }
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/comment/ReceivedCommentActivity.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.comment;
 
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.View;
@@ -177,6 +178,9 @@ public class ReceivedCommentActivity extends BaseMVPActivity<ActivityReceivedCom
 
                 }
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 9 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/course/LiveCourseFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.course;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -271,6 +272,9 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
 
                         }
                     })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
@@ -283,6 +287,11 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
                 public void onDismiss(Object o) {
                     UiUtils.refreshFilterTextStyle2(false,mViewBinding.tvTime);
                 }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle2(true,mViewBinding.tvTime);
+                }
             });
         }
         Calendar calendar = Calendar.getInstance();
@@ -290,7 +299,6 @@ public class LiveCourseFragment extends BaseMVPFragment<FragmentLiveCourseLayout
         pvTime.setDate(calendar);
         if (!pvTime.isShowing()) {
             pvTime.show();
-            UiUtils.refreshFilterTextStyle2(true,mViewBinding.tvTime);
         }
     }
 

+ 9 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/course/PianoRoomCourseFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.course;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -273,6 +274,9 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
 
                         }
                     })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
@@ -285,6 +289,11 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
                 public void onDismiss(Object o) {
                     UiUtils.refreshFilterTextStyle2(false, mViewBinding.tvTime);
                 }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
+                }
             });
         }
         Calendar calendar = Calendar.getInstance();
@@ -292,7 +301,6 @@ public class PianoRoomCourseFragment extends BaseMVPFragment<FragmentPianoRoomCo
         pvTime.setDate(calendar);
         if (!pvTime.isShowing()) {
             pvTime.show();
-            UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
         }
     }
 

+ 9 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/course/SparringCourseFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.course;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -255,6 +256,9 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
                 ivCancel.setOnClickListener(v12 -> pvTime.dismiss());
 
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
@@ -266,6 +270,11 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
                 public void onDismiss(Object o) {
                     UiUtils.refreshFilterTextStyle2(false, mViewBinding.tvTime);
                 }
+
+                @Override
+                public void onShow() {
+                    UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
+                }
             });
         }
         Calendar calendar = Calendar.getInstance();
@@ -273,7 +282,6 @@ public class SparringCourseFragment extends BaseMVPFragment<FragmentSparringCour
         pvTime.setDate(calendar);
         if (!pvTime.isShowing()) {
             pvTime.show();
-            UiUtils.refreshFilterTextStyle2(true, mViewBinding.tvTime);
         }
     }
 

+ 10 - 3
teacher/src/main/java/com/cooleshow/teacher/ui/homepage/SheetMusicPageFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.homepage;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.TextView;
@@ -174,7 +175,7 @@ public class SheetMusicPageFragment extends BaseMVPFragment<FragmentSheetMusicPa
             currentPage = 1;
             mViewBinding.searchView.getLeftText().setText(bean.name);
             queryList(true);
-        }).setLayoutRes(R.layout.pickerview_address_layout, v -> {
+        }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_address_layout, v -> {
             //自定义布局中的控件初始化及事件处理
             final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
             TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
@@ -184,7 +185,9 @@ public class SheetMusicPageFragment extends BaseMVPFragment<FragmentSheetMusicPa
             });
             ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-        }).isDialog(false).build();
+        }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT).isDialog(false).build();
         pvOptions.setPicker(subjectBeanList);
         if (currentSelectSubjectPosition < subjectBeanList.size()) {
             pvOptions.setSelectOptions(currentSelectSubjectPosition);
@@ -194,9 +197,13 @@ public class SheetMusicPageFragment extends BaseMVPFragment<FragmentSheetMusicPa
             public void onDismiss(Object o) {
                 UiUtils.refreshFilterTextStyle2(false, mViewBinding.searchView.getLeftText());
             }
+
+            @Override
+            public void onShow() {
+                UiUtils.refreshFilterTextStyle2(true, mViewBinding.searchView.getLeftText());
+            }
         });
         pvOptions.show();
-        UiUtils.refreshFilterTextStyle2(true, mViewBinding.searchView.getLeftText());
     }
 
     private void queryList(boolean isShowLoading) {

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/homepage/SparringCoursePageFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.homepage;
 
+import android.graphics.Color;
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.TextView;
@@ -152,6 +153,9 @@ public class SparringCoursePageFragment extends BaseMVPFragment<FragmentSparring
                 ivCancel.setOnClickListener(v12 -> pvTime.dismiss());
 
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 5 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/income/EarningStatisticsActivity.java

@@ -1,6 +1,7 @@
 package com.cooleshow.teacher.ui.income;
 
 import android.graphics.Bitmap;
+import android.graphics.Color;
 import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
@@ -392,6 +393,10 @@ public class EarningStatisticsActivity extends BaseMVPActivity<ActivityEarningSt
                 .isCyclic(false)//是否循环滚动
                 .setOutSideCancelable(true)//点击屏幕,点在控件外部范围时,是否取消显示
                 .setBgColor(getResources().getColor(R.color.white))//滚轮背景颜色 Night mode
+                .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT)
+                .setLineSpacingMultiplier(2.5f)
                 .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
                 .setType(new boolean[]{true, false, false, false, false, false})
                 .isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/income/FrozenAmountActivity.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.income;
 
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -219,6 +220,9 @@ public class FrozenAmountActivity extends BaseMVPActivity<ActivityFrozenAmountLa
 
                 }
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 7 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/income/MineIncomeActivity.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.income;
 
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -286,6 +287,9 @@ public class MineIncomeActivity extends BaseMVPActivity<ActivityMineIncomeBindin
 
                 }
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
@@ -354,7 +358,9 @@ public class MineIncomeActivity extends BaseMVPActivity<ActivityMineIncomeBindin
                         }
                     });
                 }
-            })
+            }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
                     .setLabels("", "", "")

+ 7 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/income/PendingAmountActivity.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.income;
 
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -249,6 +250,9 @@ public class PendingAmountActivity extends BaseMVPActivity<ActivityPendingAmount
 
                 }
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色
@@ -296,7 +300,9 @@ public class PendingAmountActivity extends BaseMVPActivity<ActivityPendingAmount
                         }
                     });
                 }
-            })
+            }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .isCenterLabel(false) //是否只显示中间选中项的label文字,false则每项item全部都带有label。
                     .setLabels("", "", "")

+ 3 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/income/WithdrawalRecordActivity.java

@@ -194,6 +194,9 @@ public class WithdrawalRecordActivity extends BaseMVPActivity<ActivityWithdrawal
 
                 }
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 5 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/live/CreateLiveActivity.java

@@ -2,6 +2,7 @@ package com.cooleshow.teacher.ui.live;
 
 import android.Manifest;
 import android.content.Intent;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.View;
@@ -166,7 +167,10 @@ public class CreateLiveActivity extends BaseMVPActivity<ActivityCreateLiveBindin
                 });
                 ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-            }).isDialog(false).build();
+            }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
+                    .setLineSpacingMultiplier(2.5f).isDialog(false).build();
         }
         pvOptions.setPicker(mTimes);
         pvOptions.show();

+ 6 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/mine/BindBankCardActivity.java

@@ -1,6 +1,7 @@
 package com.cooleshow.teacher.ui.mine;
 
 import android.content.Intent;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.View;
@@ -175,7 +176,7 @@ public class BindBankCardActivity extends BaseMVPActivity<ActivityBindBankcardBi
 
             }
         })
-                .setLayoutRes(R.layout.pickerview_address_layout, new CustomListener() {
+                .setLayoutRes(com.cooleshow.base.R.layout.pickerview_address_layout, new CustomListener() {
                     @Override
                     public void customLayout(View v) {
                         //自定义布局中的控件初始化及事件处理
@@ -196,7 +197,10 @@ public class BindBankCardActivity extends BaseMVPActivity<ActivityBindBankcardBi
                         });
 
                     }
-                })
+                }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT)
+                .setLineSpacingMultiplier(2.5f)
                 .isDialog(false)
                 .build();
         pvOptions.setPicker(bankList);

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/work/HomeWorkFragment.java

@@ -1,5 +1,6 @@
 package com.cooleshow.teacher.ui.work;
 
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -227,6 +228,9 @@ public class HomeWorkFragment extends BaseMVPFragment<FragmentHomeworkBinding, H
                 ivCancel.setOnClickListener(v12 -> pvTime.dismiss());
 
             })
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                    .setDividerColor(Color.TRANSPARENT)
+                    .setBgColor(Color.TRANSPARENT)
                     .setLineSpacingMultiplier(2.5f)
                     .setType(new boolean[]{true, true, false, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 0 - 76
teacher/src/main/res/layout/pickerview_address_layout.xml

@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@drawable/bg_white_top_10dp"
-    android:orientation="vertical">
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="50dp">
-
-
-        <TextView
-            android:id="@+id/tv_cancel"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
-            android:text="取消"
-            android:textColor="@color/color_999999"
-            android:textSize="@dimen/dp_16" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerInParent="true"
-            android:text=""
-            android:textColor="@color/color_1a1a1a"
-            android:textSize="18dp" />
-
-        <TextView
-            android:id="@+id/tv_finish"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentRight="true"
-            android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
-            android:text="确定"
-            android:textColor="@color/colorPrimary"
-            android:textSize="@dimen/dp_16" />
-
-    </RelativeLayout>
-
-    <View style="@style/line_style" />
-    <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
-    <LinearLayout
-        android:id="@+id/optionspicker"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="#ffffff"
-        android:gravity="center"
-        android:minHeight="150dp"
-        android:orientation="horizontal">
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options1"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options2"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options3"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-    </LinearLayout>
-
-
-</LinearLayout>

+ 33 - 11
teacher/src/main/res/layout/pickerview_bank_layout.xml

@@ -1,23 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:background="@drawable/bg_white_top_10dp"
     android:orientation="vertical">
 
     <RelativeLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:id="@+id/rl_top"
         android:layout_width="match_parent"
-        android:layout_height="50dp">
+        android:layout_height="wrap_content">
 
 
         <TextView
+            android:padding="14dp"
             android:id="@+id/tv_cancel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
+            android:layout_marginLeft="6dp"
             android:text="取消"
-            android:textColor="@color/color_999999"
+            android:textColor="@color/color_666666"
             android:textSize="@dimen/dp_16" />
 
         <TextView
@@ -34,21 +39,38 @@
             android:layout_height="wrap_content"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
+            android:layout_marginRight="6dp"
+            android:padding="14dp"
             android:text="确定"
-            android:textColor="@color/colorPrimary"
+            android:textColor="@color/color_2dc7aa"
             android:textSize="@dimen/dp_16" />
 
     </RelativeLayout>
 
-    <View style="@style/line_style" />
+    <View
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintBottom_toBottomOf="@+id/optionspicker"
+        app:layout_constraintTop_toTopOf="@+id/optionspicker"
+        android:background="@drawable/shape_f2f2f2_6dp"
+        android:layout_width="match_parent"
+        android:layout_height="44dp"/>
+
+    <View
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/rl_top"
+        android:id="@+id/view_line"
+        style="@style/line_style"
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"/>
     <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
     <LinearLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_line"
         android:id="@+id/optionspicker"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="#ffffff"
+        android:layout_height="@dimen/dp_250"
         android:gravity="center"
         android:minHeight="150dp"
         android:orientation="horizontal">
@@ -62,4 +84,4 @@
     </LinearLayout>
 
 
-</LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 33 - 12
teacher/src/main/res/layout/pickerview_live_time_layout.xml

@@ -1,27 +1,31 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:background="@drawable/bg_white_top_10dp"
     android:orientation="vertical">
 
     <RelativeLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        android:id="@+id/rl_top"
         android:layout_width="match_parent"
-        android:layout_height="50dp">
+        android:layout_height="wrap_content">
 
 
         <TextView
+            android:padding="14dp"
             android:id="@+id/tv_cancel"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
+            android:layout_marginLeft="6dp"
             android:text="取消"
-            android:textColor="@color/color_999999"
+            android:textColor="@color/color_666666"
             android:textSize="@dimen/dp_16" />
 
         <TextView
-            android:id="@+id/tv_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerInParent="true"
@@ -35,21 +39,38 @@
             android:layout_height="wrap_content"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
+            android:layout_marginRight="6dp"
+            android:padding="14dp"
             android:text="确定"
-            android:textColor="@color/colorPrimary"
+            android:textColor="@color/color_2dc7aa"
             android:textSize="@dimen/dp_16" />
 
     </RelativeLayout>
 
-    <View style="@style/line_style" />
+    <View
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintBottom_toBottomOf="@+id/optionspicker"
+        app:layout_constraintTop_toTopOf="@+id/optionspicker"
+        android:background="@drawable/shape_f2f2f2_6dp"
+        android:layout_width="match_parent"
+        android:layout_height="44dp"/>
+
+    <View
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/rl_top"
+        android:id="@+id/view_line"
+        style="@style/line_style"
+        android:layout_marginEnd="13dp"
+        android:layout_marginStart="13dp"/>
     <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
     <LinearLayout
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/view_line"
         android:id="@+id/optionspicker"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="#ffffff"
+        android:layout_height="@dimen/dp_250"
         android:gravity="center"
         android:minHeight="150dp"
         android:orientation="horizontal">
@@ -74,4 +95,4 @@
     </LinearLayout>
 
 
-</LinearLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 2
usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/BindPasswordActivity.java

@@ -1,6 +1,7 @@
 package com.cooleshow.usercenter.ui.activity;
 
 import android.content.Intent;
+import android.graphics.Color;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.view.View;
@@ -131,7 +132,7 @@ public class BindPasswordActivity extends BaseMVPActivity<ActivityBindPwdLayoutB
                 viewBinding.tvSetSex.setText(s);
                 setGanderValue(s);
             }
-        }).setLayoutRes(R.layout.pickerview_sex_select_layout, v -> {
+        }).setLayoutRes(com.cooleshow.base.R.layout.pickerview_default_layout, v -> {
             //自定义布局中的控件初始化及事件处理
             final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
             TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
@@ -141,7 +142,10 @@ public class BindPasswordActivity extends BaseMVPActivity<ActivityBindPwdLayoutB
             });
             ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-        }).isDialog(false).build();
+        }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT)
+                .setLineSpacingMultiplier(2.5f).isDialog(false).build();
         pvOptions.setPicker(sexList);
         pvOptions.show();
 

+ 4 - 2
usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/setting/FeedBackActivity.java

@@ -376,8 +376,10 @@ public class FeedBackActivity extends BaseMVPActivity<ActivityFeedbackLayoutBind
                     });
                     ivCancel.setOnClickListener(v1 -> pvOptions.dismiss());
 
-                }).setDividerColor(Color.TRANSPARENT)
-                .setBgColor(Color.TRANSPARENT).isDialog(false).build();
+                }).setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
+                .setDividerColor(Color.TRANSPARENT)
+                .setBgColor(Color.TRANSPARENT)
+                .setLineSpacingMultiplier(2.5f).isDialog(false).build();
 
         pvOptions.setPicker(types);
         if (currentSelectTypePosition != -1 && currentSelectTypePosition < types.size()) {

+ 4 - 3
usercenter/src/main/java/com/cooleshow/usercenter/widget/FeedBackRecordFilterView.java

@@ -220,9 +220,9 @@ public class FeedBackRecordFilterView extends FrameLayout implements View.OnClic
                         @Override
                         public void customLayout(View v) {
                             //自定义布局中的控件初始化及事件处理
-                            final TextView tvSubmit = (TextView) v.findViewById(R.id.tv_finish);
+                            final TextView tvSubmit = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_finish);
                             tvSubmit.setTextColor(getContext().getResources().getColor(StyleConfig.getMainColor()));
-                            TextView ivCancel = (TextView) v.findViewById(R.id.tv_cancel);
+                            TextView ivCancel = (TextView) v.findViewById(com.cooleshow.base.R.id.tv_cancel);
                             tvSubmit.setOnClickListener(new OnClickListener() {
                                 @Override
                                 public void onClick(View v) {
@@ -240,9 +240,10 @@ public class FeedBackRecordFilterView extends FrameLayout implements View.OnClic
                         }
                     }).setType(new boolean[]{true, true, true, false
                             , false, false})// 默认全部显示
-                    .setLineSpacingMultiplier(2.5f)
+                    .setTextColorOut(getResources().getColor(com.cooleshow.base.R.color.color_aaaaaa))
                     .setDividerColor(Color.TRANSPARENT)
                     .setBgColor(Color.TRANSPARENT)
+                    .setLineSpacingMultiplier(2.5f)
                     .setContentTextSize(16)
                     .setType(new boolean[]{true, true, true, false, false, false})// 默认全部显示
                     .setTextColorCenter(getResources().getColor(com.cooleshow.base.R.color.color_1a1a1a))//设置选中项的颜色

+ 0 - 76
usercenter/src/main/res/layout/pickerview_sex_select_layout.xml

@@ -1,76 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:background="@drawable/bg_white_top_10dp"
-    android:orientation="vertical">
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="50dp">
-
-
-        <TextView
-            android:id="@+id/tv_cancel"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerVertical="true"
-            android:layout_marginLeft="17dp"
-            android:text="取消"
-            android:textColor="@color/color_999999"
-            android:textSize="@dimen/dp_16" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_centerInParent="true"
-            android:text=""
-            android:textColor="@color/color_1a1a1a"
-            android:textSize="18dp" />
-
-        <TextView
-            android:id="@+id/tv_finish"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentRight="true"
-            android:layout_centerVertical="true"
-            android:layout_marginRight="17dp"
-            android:padding="8dp"
-            android:text="确定"
-            android:textColor="@color/colorPrimary"
-            android:textSize="@dimen/dp_16" />
-
-    </RelativeLayout>
-
-    <View style="@style/line_style" />
-    <!--此部分需要完整复制过去,删减或者更改ID会导致初始化找不到内容而报空-->
-    <LinearLayout
-        android:id="@+id/optionspicker"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/dp_200"
-        android:background="#ffffff"
-        android:gravity="center"
-        android:minHeight="150dp"
-        android:orientation="horizontal">
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options1"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options2"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-
-        <com.contrarywind.view.WheelView
-            android:id="@+id/options3"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_weight="1" />
-    </LinearLayout>
-
-
-</LinearLayout>

Some files were not shown because too many files changed in this diff