diff --git a/app/build.gradle b/app/build.gradle index 1fdc78c..4433bc3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,12 +1,11 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 24 - buildToolsVersion "24.0.3" + compileSdkVersion 27 defaultConfig { applicationId "you.xiaochen.wheel" minSdkVersion 14 - targetSdkVersion 22 + targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -20,11 +19,11 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + implementation fileTree(dir: 'libs', include: ['*.jar']) + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:24.2.0' - compile 'com.android.support:recyclerview-v7:24.2.0' - testCompile 'junit:junit:4.12' + implementation 'com.android.support:appcompat-v7:27.1.0' + implementation 'com.android.support:recyclerview-v7:27.1.0' + testImplementation 'junit:junit:4.12' } diff --git a/app/src/main/java/you/xiaochen/wheel/MainActivity.java b/app/src/main/java/you/xiaochen/wheel/MainActivity.java index 7ae4606..728f40a 100644 --- a/app/src/main/java/you/xiaochen/wheel/MainActivity.java +++ b/app/src/main/java/you/xiaochen/wheel/MainActivity.java @@ -2,24 +2,28 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import android.view.View; import android.widget.TextView; import java.util.ArrayList; import java.util.Arrays; +import java.util.Calendar; import java.util.List; +import you.xiaochen.wheel.widget.DatePickerDialog; import you.xiaochen.wheel.widget.WheelView; public class MainActivity extends AppCompatActivity { private WheelView wv_city, wv_county, wv_name; + private WheelView wv_number; private CityAdapter cityAdapter; private CountyAdapter countyAdapter; - private TextView tv_city, tv_county, tv_number; + private TextView tv_city, tv_county, tv_number, tvDatePicker; + private DatePickerDialog dialog; - private WheelView wv_number; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -34,13 +38,15 @@ protected void onCreate(Bundle savedInstanceState) { tv_county = (TextView) findViewById(R.id.tv_county); tv_number = (TextView) findViewById(R.id.tv_number); + tvDatePicker = (TextView) findViewById(R.id.datePicker); + /* 市滑轮控件 */ cityAdapter = new CityAdapter(); wv_city.setAdapter(cityAdapter); wv_city.setOnItemSelectedListener(new WheelView.OnItemSelectedListener() { @Override - public void onItemSelected(int index) { + public void onItemSelected(WheelView wheelView, int index) { tv_city.setText("市: "+cityAdapter.getItem(index)); List strs = Arrays.asList(TestDatas.AREAS[index]); countyAdapter.strs.clear(); @@ -54,10 +60,9 @@ public void onItemSelected(int index) { /* 区滑轮控件 */ - wv_county.setOnItemSelectedListener(new WheelView.OnItemSelectedListener() { @Override - public void onItemSelected(int index) { + public void onItemSelected(WheelView wheelView, int index) { tv_county.setText("县: "+countyAdapter.getItem(index)); } }); @@ -92,16 +97,35 @@ protected String getItem(int index) { }); wv_number.setOnItemSelectedListener(new WheelView.OnItemSelectedListener() { @Override - public void onItemSelected(int index) { + public void onItemSelected(WheelView wheelView, int index) { tv_number.setText("水平布局"+index); } }); wv_number.setCurrentItem(88); + + dialog = new DatePickerDialog(this); + dialog.setDate(Calendar.getInstance(), false); + dialog.setOnDateSelectedListener(new DatePickerDialog.OnDateSelectedListener() { + @Override + public void onDateSelected(int year, int month, int dayOfMonth) { + tvDatePicker.setText(String.format("%s年%s月%s日", year, month + 1, dayOfMonth)); + } + }); + //Activity2.lanuch(this); } - private class CityAdapter extends WheelView.WheelAdapter { + public void viewClick(View view) { + String tag = (String) view.getTag(); + if ("WheelRecyclerView".equals(tag)) { + Activity2.lanuch(this); + } else { + dialog.show(); + } + } + + private static class CityAdapter extends WheelView.WheelAdapter { @Override protected int getItemCount() { return TestDatas.NAMES.length; @@ -113,7 +137,7 @@ protected String getItem(int index) { } } - private class CountyAdapter extends WheelView.WheelAdapter { + private static class CountyAdapter extends WheelView.WheelAdapter { private List strs; CountyAdapter() { @@ -131,5 +155,4 @@ protected String getItem(int index) { } } - } diff --git a/app/src/main/java/you/xiaochen/wheel/widget/DatePickerDialog.java b/app/src/main/java/you/xiaochen/wheel/widget/DatePickerDialog.java new file mode 100644 index 0000000..4cb4647 --- /dev/null +++ b/app/src/main/java/you/xiaochen/wheel/widget/DatePickerDialog.java @@ -0,0 +1,212 @@ +package you.xiaochen.wheel.widget; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import you.xiaochen.wheel.R; + +public class DatePickerDialog extends Dialog implements View.OnClickListener, WheelView.OnItemSelectedListener { + + WheelView yearWheelView; + WheelView monthWheelView; + WheelView dayWheelView; + View doneView; + + WheelView.SimpleAdapter yearAdapter = new WheelView.SimpleAdapter(); + WheelView.SimpleAdapter monthAdapter = new WheelView.SimpleAdapter(); + WheelView.SimpleAdapter dayAdapter = new WheelView.SimpleAdapter(); + + List years = new ArrayList<>(); + + Calendar selectedCalendar; + + int selectedYearIndex, selectedMonthIndex, selectedDayIndex; + + OnDateSelectedListener listener; + + int initYear, initMonth, initDay; + + boolean mOnlyHistory; + + public DatePickerDialog(@NonNull Context context) { + this(context, R.style.disFloatingDialog); + } + + public DatePickerDialog(@NonNull Context context, int themeResId) { + super(context, themeResId); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + WindowManager.LayoutParams attr = getWindow().getAttributes(); + attr.height = WindowManager.LayoutParams.WRAP_CONTENT; + attr.gravity = Gravity.BOTTOM; +// attr.windowAnimations = R.style.bottomWindowAnim; + + //setCanceledOnTouchOutside(true); + + setContentView(R.layout.dialog_date_picker); + View root = getWindow().findViewById(Window.ID_ANDROID_CONTENT); + if (root != null) { + yearWheelView = root.findViewWithTag("yearWheel"); + monthWheelView = root.findViewWithTag("monthWheel"); + dayWheelView = root.findViewWithTag("dayWheel"); + doneView = root.findViewWithTag("done"); + doneView.setOnClickListener(this); + } + } + + public void setOnDateSelectedListener(OnDateSelectedListener l) { + listener = l; + } + + public void setDate(Calendar calendar) { + setDate(calendar, true); + } + + public void setDate(Calendar calendar, boolean onlyHistory) { + mOnlyHistory = onlyHistory; + if (calendar == null) { + calendar = Calendar.getInstance(); + } + selectedCalendar = calendar; + int year, month, x; + year = calendar.get(Calendar.YEAR); + initMonth = selectedMonthIndex = calendar.get(Calendar.MONTH); + month = calendar.get(Calendar.DAY_OF_MONTH); + initDay = selectedDayIndex = month - 1; + for (int i = 10; i > 0; i--) { + x = year - i; + years.add(x); + yearAdapter.add(String.format("%s年", x)); + } + years.add(year); + yearAdapter.add(String.format("%s年", year)); + initYear = selectedYearIndex = years.size() - 1; + if (!onlyHistory) { + for (int i = 1; i < 11; i++) { + x = year + i; + years.add(x); + yearAdapter.add(String.format("%s年", x)); + } + } + updateMonths(); + updateDays(); + } + + private void updateMonths() { + selectedCalendar.set(Calendar.YEAR, years.get(selectedYearIndex)); + int months = selectedCalendar.getActualMaximum(Calendar.MONTH) + 1; + int x; + monthAdapter.clear(); + for (int i = 0; i < months; i++) { + if (mOnlyHistory && selectedYearIndex == initYear) { + if (i > initMonth) continue; + x = i + 1; + monthAdapter.add(String.format("%s月", x)); + } else { + x = i + 1; + monthAdapter.add(String.format("%s月", x)); + } + } + monthAdapter.notifyDataSetChanged(); + if (monthWheelView != null) { + if (selectedMonthIndex >= monthAdapter.size()) { + selectedMonthIndex = monthAdapter.size() - 1; + } + monthWheelView.setCurrentItem(selectedMonthIndex); + } + } + + private void updateDays() { + selectedCalendar.set(Calendar.YEAR, years.get(selectedYearIndex)); + selectedCalendar.set(Calendar.MONTH, selectedMonthIndex); + int daysOfMonth = selectedCalendar.getActualMaximum(Calendar.DAY_OF_MONTH); + int x; + dayAdapter.clear(); + for (int i = 0; i < daysOfMonth; i++) { + if (mOnlyHistory && selectedYearIndex == initYear + && selectedMonthIndex == initMonth) { + if (i > initDay) continue; + x = i + 1; + dayAdapter.add(String.format("%s日", x)); + } else { + x = i + 1; + dayAdapter.add(String.format("%s日", x)); + } + } + dayAdapter.notifyDataSetChanged(); + if (dayWheelView != null) { + if (selectedDayIndex >= dayAdapter.size()) { + selectedDayIndex = dayAdapter.size() - 1; + } + dayWheelView.setCurrentItem(selectedDayIndex); + } + } + + @Override + public void onItemSelected(WheelView wheelView, int index) { + String tag = wheelView.getTag().toString(); + switch (tag) { + case "yearWheel": + selectedYearIndex = index; + updateMonths(); + updateDays(); + break; + case "monthWheel": + selectedMonthIndex = index; + updateDays(); + break; + case "dayWheel": + selectedDayIndex = index; + } + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + yearWheelView.setOnItemSelectedListener(this); + yearWheelView.setAdapter(yearAdapter); + yearWheelView.setCurrentItem(selectedYearIndex); + monthWheelView.setOnItemSelectedListener(this); + monthWheelView.setAdapter(monthAdapter); + monthWheelView.setCurrentItem(selectedMonthIndex); + dayWheelView.setOnItemSelectedListener(this); + dayWheelView.setAdapter(dayAdapter); + dayWheelView.setCurrentItem(selectedDayIndex); + } + + @Override + public void show() { + super.show(); + } + + @Override + public void dismiss() { + super.dismiss(); + } + + @Override + public void onClick(View v) { + if (listener != null) { + listener.onDateSelected(years.get(selectedYearIndex), selectedMonthIndex, selectedDayIndex + 1); + } + dismiss(); + } + + public interface OnDateSelectedListener { + void onDateSelected(int year, int month, int dayOfMonth); + } +} diff --git a/app/src/main/java/you/xiaochen/wheel/widget/WheelView.java b/app/src/main/java/you/xiaochen/wheel/widget/WheelView.java index 511a848..c3cea1f 100644 --- a/app/src/main/java/you/xiaochen/wheel/widget/WheelView.java +++ b/app/src/main/java/you/xiaochen/wheel/widget/WheelView.java @@ -9,8 +9,9 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.LinearLayout; + +import java.util.ArrayList; +import java.util.List; import you.xiaochen.wheel.R; @@ -119,14 +120,14 @@ private void init(Context context, AttributeSet attrs) { private void initRecyclerView(Context context) { mRecyclerView = new RecyclerView(context); mRecyclerView.setOverScrollMode(OVER_SCROLL_NEVER); - int totolItemSize = (itemCount * 2 + 1) * itemSize; + int totalItemSize = (itemCount * 2 + 1) * itemSize; layoutManager = new LinearLayoutManager(context); layoutManager.setOrientation(orientation == WHEEL_VERTICAL ? LinearLayoutManager.VERTICAL : LinearLayoutManager.HORIZONTAL); mRecyclerView.setLayoutManager(layoutManager); //让滑动结束时都能定到中心位置 new LinearSnapHelper().attachToRecyclerView(mRecyclerView); - this.addView(mRecyclerView, WheelUtils.createLayoutParams(orientation, totolItemSize)); + this.addView(mRecyclerView, WheelUtils.createLayoutParams(orientation, totalItemSize)); wheelAdapter = new WheelViewAdapter(orientation, itemSize, itemCount); wheelDecoration = new SimpleWheelDecoration(wheelAdapter, gravity, textColor, textColorCenter, textSize, dividerColor, dividerSize); @@ -138,7 +139,7 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (wheelDecoration.centerItemPosition == IDLE_POSITION || newState != RecyclerView.SCROLL_STATE_IDLE) return; selectedPosition = wheelDecoration.centerItemPosition; if (selectedPosition != lastSelectedPosition) { - listener.onItemSelected(wheelDecoration.centerItemPosition); + listener.onItemSelected(WheelView.this, wheelDecoration.centerItemPosition); lastSelectedPosition = selectedPosition; } } @@ -226,7 +227,7 @@ public void setAdapter(WheelAdapter adapter) { } public WheelAdapter getAdapter() { - return adapter; + return wheelAdapter.adapter; } public void setCurrentItem(int position) { @@ -243,11 +244,42 @@ public void setOnItemSelectedListener(OnItemSelectedListener listener) { this.listener = listener; } + public static class SimpleAdapter extends WheelView.WheelAdapter { + + private List strings = new ArrayList<>(); + + public void add(String s) { + strings.add(s); + } + + public void addAll(List list) { + strings.addAll(list); + } + + public void clear() { + strings.clear(); + } + + public int size() { + return strings.size(); + } + + @Override + protected int getItemCount() { + return strings.size(); + } + + @Override + protected String getItem(int index) { + return strings.get(index); + } + } + /** * item selected */ public interface OnItemSelectedListener { - void onItemSelected(int index); + void onItemSelected(WheelView wheelView, int index); } /** diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6655d40..c023101 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -97,11 +97,12 @@ - @@ -116,4 +117,24 @@ app:wheelOrientation="horizontal" app:wheelTextSize="25sp"/> + + + + diff --git a/app/src/main/res/layout/dialog_date_picker.xml b/app/src/main/res/layout/dialog_date_picker.xml new file mode 100644 index 0000000..b8ab7f4 --- /dev/null +++ b/app/src/main/res/layout/dialog_date_picker.xml @@ -0,0 +1,69 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml deleted file mode 100644 index 63fc816..0000000 --- a/app/src/main/res/values-w820dp/dimens.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - 64dp - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5885930..f63c26f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -8,4 +8,9 @@ @color/colorAccent + + diff --git a/build.gradle b/build.gradle index c20bca1..804e9f4 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:3.1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -15,6 +16,7 @@ buildscript { allprojects { repositories { jcenter() + google() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 04e285f..24e7c39 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/wheelview.apk b/wheelview.apk deleted file mode 100644 index f6a0922..0000000 Binary files a/wheelview.apk and /dev/null differ