1818import java .util .Locale ;
1919
2020import cn .qqtheme .framework .util .DateUtils ;
21+ import cn .qqtheme .framework .util .LogUtils ;
2122import cn .qqtheme .framework .widget .WheelView ;
2223
2324/**
2728 * @since 2015/12/14
2829 */
2930public class DatePicker extends WheelPicker {
30- /**
31- * 年月日
32- */
33- public static final int YEAR_MONTH_DAY = 0 ;
34- /**
35- * 年月
36- */
37- public static final int YEAR_MONTH = 1 ;
38- /**
39- * 月日
40- */
41- public static final int MONTH_DAY = 2 ;
31+ public static final int YEAR_MONTH_DAY = 0 ;//年月日
32+ public static final int YEAR_MONTH = 1 ;//年月
33+ public static final int MONTH_DAY = 2 ;//月日
4234 private ArrayList <String > years = new ArrayList <String >();
4335 private ArrayList <String > months = new ArrayList <String >();
4436 private ArrayList <String > days = new ArrayList <String >();
@@ -122,6 +114,8 @@ public void setRangeStart(int startYearOrMonth, int startMonthOrDay) {
122114 this .startYear = startYearOrMonth ;
123115 this .startMonth = startMonthOrDay ;
124116 } else {
117+ int year = Calendar .getInstance (Locale .CHINA ).get (Calendar .YEAR );
118+ startYear = endYear = year ;
125119 this .startMonth = startYearOrMonth ;
126120 this .startDay = startMonthOrDay ;
127121 }
@@ -143,24 +137,6 @@ public void setRangeEnd(int endYearOrMonth, int endMonthOrDay) {
143137 }
144138 }
145139
146- private int findItemIndex (ArrayList <String > items , int item ) {
147- //折半查找有序元素的索引
148- int index = Collections .binarySearch (items , item , new Comparator <Object >() {
149- @ Override
150- public int compare (Object lhs , Object rhs ) {
151- String lhsStr = lhs .toString ();
152- String rhsStr = rhs .toString ();
153- lhsStr = lhsStr .startsWith ("0" ) ? lhsStr .substring (1 ) : lhsStr ;
154- rhsStr = rhsStr .startsWith ("0" ) ? rhsStr .substring (1 ) : rhsStr ;
155- return Integer .parseInt (lhsStr ) - Integer .parseInt (rhsStr );
156- }
157- });
158- if (index < 0 ) {
159- index = 0 ;
160- }
161- return index ;
162- }
163-
164140 /**
165141 * 设置默认选中的年月日
166142 */
@@ -177,15 +153,17 @@ public void setSelectedItem(int year, int month, int day) {
177153 * 设置默认选中的年月或者月日
178154 */
179155 public void setSelectedItem (int yearOrMonth , int monthOrDay ) {
180- int year = Calendar .getInstance (Locale .CHINA ).get (Calendar .YEAR );
181- changeYearData ();
182156 if (mode == MONTH_DAY ) {
157+ int year = Calendar .getInstance (Locale .CHINA ).get (Calendar .YEAR );
158+ startYear = endYear = year ;
159+ changeYearData ();
183160 changeMonthData (year );
184161 changeDayData (year , yearOrMonth );
185162 selectedMonthIndex = findItemIndex (months , yearOrMonth );
186163 selectedDayIndex = findItemIndex (days , monthOrDay );
187164 } else {
188- changeMonthData (year );
165+ changeYearData ();
166+ changeMonthData (yearOrMonth );
189167 selectedYearIndex = findItemIndex (years , yearOrMonth );
190168 selectedMonthIndex = findItemIndex (months , monthOrDay );
191169 }
@@ -268,7 +246,6 @@ protected View makeCenterView() {
268246 if (!TextUtils .isEmpty (yearLabel )) {
269247 yearTextView .setText (yearLabel );
270248 }
271- changeYearData ();
272249 if (selectedYearIndex == 0 ) {
273250 yearView .setItems (years );
274251 } else {
@@ -319,6 +296,24 @@ public void onSelected(boolean isUserScroll, int selectedIndex, String item) {
319296 return layout ;
320297 }
321298
299+ private int findItemIndex (ArrayList <String > items , int item ) {
300+ //折半查找有序元素的索引,效率应该高于items.indexOf(...)
301+ int index = Collections .binarySearch (items , item , new Comparator <Object >() {
302+ @ Override
303+ public int compare (Object lhs , Object rhs ) {
304+ String lhsStr = lhs .toString ();
305+ String rhsStr = rhs .toString ();
306+ lhsStr = lhsStr .startsWith ("0" ) ? lhsStr .substring (1 ) : lhsStr ;
307+ rhsStr = rhsStr .startsWith ("0" ) ? rhsStr .substring (1 ) : rhsStr ;
308+ return Integer .parseInt (lhsStr ) - Integer .parseInt (rhsStr );
309+ }
310+ });
311+ if (index < 0 ) {
312+ index = 0 ;
313+ }
314+ return index ;
315+ }
316+
322317 private void changeYearData () {
323318 years .clear ();
324319 if (startYear == endYear ) {
@@ -356,7 +351,9 @@ private int changeMonthData(int year) {
356351 months .add (DateUtils .fillZero (i ));
357352 }
358353 }
359- selectedMonthIndex = (preSelectMonth == null || !months .contains (preSelectMonth )) ? 0 : months .indexOf (preSelectMonth );
354+ //当前设置的月份不在指定范围,则默认选中范围开始的月份
355+ int preSelectMonthIndex = preSelectMonth == null ? 0 : months .indexOf (preSelectMonth );
356+ selectedMonthIndex = preSelectMonthIndex == -1 ? 0 : preSelectMonthIndex ;
360357 return DateUtils .trimZero (months .get (selectedMonthIndex ));
361358 }
362359
@@ -368,12 +365,16 @@ private void changeDayData(int year, int month) {
368365 for (int i = startDay ; i <= maxDays ; i ++) {
369366 days .add (DateUtils .fillZero (i ));
370367 }
371- selectedDayIndex = (preSelectDay == null || !days .contains (preSelectDay )) ? 0 : days .indexOf (preSelectDay );
368+ //当前设置的日子不在指定范围,则默认选中范围开始的日子
369+ int preSelectDayIndex = preSelectDay == null ? 0 : days .indexOf (preSelectDay );
370+ selectedDayIndex = preSelectDayIndex == -1 ? 0 : preSelectDayIndex ;
372371 } else if (year == endYear && month == endMonth ) {
373372 for (int i = 1 ; i <= endDay ; i ++) {
374373 days .add (DateUtils .fillZero (i ));
375374 }
376- selectedDayIndex = (preSelectDay == null || !days .contains (preSelectDay )) ? 0 : days .indexOf (preSelectDay );
375+ //当前设置的日子不在指定范围,则默认选中范围开始的日子
376+ int preSelectDayIndex = preSelectDay == null ? 0 : days .indexOf (preSelectDay );
377+ selectedDayIndex = preSelectDayIndex == -1 ? 0 : preSelectDayIndex ;
377378 } else {
378379 for (int i = 1 ; i <= maxDays ; i ++) {
379380 days .add (DateUtils .fillZero (i ));
0 commit comments