From 524845abe91420a653840e6e3ee49b0fc4110c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20W=C3=B3jcik?= Date: Sun, 4 Mar 2018 11:18:16 +0100 Subject: [PATCH 1/2] Add single page swipe mode --- .../cosmocalendar/view/CalendarView.java | 31 ++++++++++++++----- cosmocalendar/src/main/res/values/attrs.xml | 2 ++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java index 8d224b7..f30ff6b 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java @@ -14,9 +14,12 @@ import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.OrientationHelper; +import android.support.v7.widget.PagerSnapHelper; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SimpleItemAnimator; +import android.support.v7.widget.SnapHelper; import android.util.AttributeSet; +import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -90,7 +93,7 @@ public class CalendarView extends RelativeLayout implements OnDaySelectedListene //Helpers private SettingsManager settingsManager; private BaseSelectionManager selectionManager; - private GravitySnapHelper snapHelper; + private SnapHelper snapHelper; //Listeners private OnMonthChangeListener onMonthChangeListener; @@ -100,6 +103,8 @@ public class CalendarView extends RelativeLayout implements OnDaySelectedListene private FetchMonthsAsyncTask asyncTask; + private boolean swipeSinglePage; + public CalendarView(Context context) { super(context); init(); @@ -174,6 +179,8 @@ private void handleAttributes(TypedArray typedArray) { int previousMonthIconRes = typedArray.getResourceId(R.styleable.CalendarView_previousMonthIconRes, R.drawable.ic_chevron_left_gray); int nextMonthIconRes = typedArray.getResourceId(R.styleable.CalendarView_nextMonthIconRes, R.drawable.ic_chevron_right_gray); + swipeSinglePage = typedArray.getBoolean(R.styleable.CalendarView_singlePageSwipe, false); + setBackgroundColor(calendarBackgroundColor); settingsManager.setCalendarBackgroundColor(calendarBackgroundColor); settingsManager.setMonthTextColor(monthTextColor); @@ -381,6 +388,7 @@ public void update() { private void createRecyclerView() { rvMonths = new SlowdownRecyclerView(getContext()); + rvMonths.setId(View.generateViewId()); rvMonths.setHasFixedSize(true); rvMonths.setNestedScrollingEnabled(false); @@ -603,7 +611,8 @@ public List getSelectedDates() { * Scroll calendar to previous month */ public void goToPreviousMonth() { - int currentVisibleItemPosition = ((GridLayoutManager) rvMonths.getLayoutManager()).findFirstVisibleItemPosition(); + + int currentVisibleItemPosition = ((GridLayoutManager) rvMonths.getLayoutManager()).findFirstCompletelyVisibleItemPosition(); if (currentVisibleItemPosition != 0) { rvMonths.smoothScrollToPosition(currentVisibleItemPosition - 1); } @@ -613,7 +622,7 @@ public void goToPreviousMonth() { * Scroll calendar to next month */ public void goToNextMonth() { - int currentVisibleItemPosition = ((GridLayoutManager) rvMonths.getLayoutManager()).findFirstVisibleItemPosition(); + int currentVisibleItemPosition = ((GridLayoutManager) rvMonths.getLayoutManager()).findFirstCompletelyVisibleItemPosition(); if (currentVisibleItemPosition != monthAdapter.getData().size() - 1) { rvMonths.smoothScrollToPosition(currentVisibleItemPosition + 1); } @@ -948,7 +957,7 @@ public void setCalendarOrientation(int calendarOrientation) { rvMonths.setLayoutManager(new GridLayoutManager(getContext(), 1, getCalendarOrientation(), false)); - changeSnapHelper(); + //changeSnapHelper(); if (getCalendarOrientation() == LinearLayout.HORIZONTAL) { if (flNavigationButtons != null) { @@ -1042,11 +1051,17 @@ public void setFirstDayOfWeek(int firstDayOfWeek) { private void changeSnapHelper() { rvMonths.setOnFlingListener(null); - if (snapHelper == null) { - snapHelper = new GravitySnapHelper(settingsManager.getCalendarOrientation() == LinearLayoutManager.VERTICAL ? Gravity.TOP : Gravity.START, true, this); + if (swipeSinglePage){ + snapHelper = new PagerSnapHelper(); snapHelper.attachToRecyclerView(rvMonths); - } else { - snapHelper.setGravity(settingsManager.getCalendarOrientation() == LinearLayoutManager.VERTICAL ? Gravity.TOP : Gravity.START); + }else{ + if (snapHelper == null) { + snapHelper = new GravitySnapHelper(settingsManager.getCalendarOrientation() == LinearLayoutManager.VERTICAL ? Gravity.TOP : Gravity.START, true, this); + snapHelper.attachToRecyclerView(rvMonths); + } else { + if (snapHelper instanceof GravitySnapHelper) + ((GravitySnapHelper)snapHelper).setGravity(settingsManager.getCalendarOrientation() == LinearLayoutManager.VERTICAL ? Gravity.TOP : Gravity.START); + } } } diff --git a/cosmocalendar/src/main/res/values/attrs.xml b/cosmocalendar/src/main/res/values/attrs.xml index cdfd40d..40b8664 100644 --- a/cosmocalendar/src/main/res/values/attrs.xml +++ b/cosmocalendar/src/main/res/values/attrs.xml @@ -64,5 +64,7 @@ + + \ No newline at end of file From a48644629826b28a2a94b42b21d3e133a0fcdaa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20W=C3=B3jcik?= Date: Sun, 4 Mar 2018 15:02:11 +0100 Subject: [PATCH 2/2] Fix previous and next button --- .../applikeysolutions/cosmocalendar/view/CalendarView.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java index f30ff6b..8f9283a 100644 --- a/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java +++ b/cosmocalendar/src/main/java/com/applikeysolutions/cosmocalendar/view/CalendarView.java @@ -472,8 +472,15 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { //Hide navigation buttons boolean show = newState != RecyclerView.SCROLL_STATE_DRAGGING; + ivPrevious.setVisibility(show ? View.VISIBLE : View.GONE); ivNext.setVisibility(show ? View.VISIBLE : View.GONE); + + boolean clickable = newState == RecyclerView.SCROLL_STATE_IDLE; + + ivPrevious.setClickable(clickable); + ivNext.setClickable(clickable); + } super.onScrollStateChanged(recyclerView, newState);