From 310e84cfca9510e27f12e41255afc812aef4a17e Mon Sep 17 00:00:00 2001 From: Henning Hall Date: Thu, 10 Sep 2020 22:01:54 +0200 Subject: [PATCH] bugfix: onDateChange not called on tapped (#240) --- .../date_picker/pickers/AndroidNative.java | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/android/src/main/java/com/henninghall/date_picker/pickers/AndroidNative.java b/android/src/main/java/com/henninghall/date_picker/pickers/AndroidNative.java index 29ad817..16fd65a 100644 --- a/android/src/main/java/com/henninghall/date_picker/pickers/AndroidNative.java +++ b/android/src/main/java/com/henninghall/date_picker/pickers/AndroidNative.java @@ -20,6 +20,7 @@ public class AndroidNative extends NumberPicker implements Picker { private Picker.OnValueChangeListener onValueChangedListener; private int state = SCROLL_STATE_IDLE; + private OnValueChangeListenerInScrolling listenerInScrolling; public AndroidNative(Context context) { super(context); @@ -158,13 +159,7 @@ public class AndroidNative extends NumberPicker implements Picker { public void run() { changeValueByOne(self, increment); if (isLast) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - onValueChangedListener.onValueChange(); - } - // the delay make sure the wheel has stopped before sending the value change event - }, 500); + sendEventIn500ms(); } } }, ms); @@ -172,34 +167,53 @@ public class AndroidNative extends NumberPicker implements Picker { @Override public void setOnValueChangeListenerInScrolling(final OnValueChangeListenerInScrolling listener) { + listenerInScrolling = listener; + } + + @Override + public void setOnValueChangedListener(final Picker.OnValueChangeListener listener) { + this.onValueChangedListener = listener; final Picker self = this; + super.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { @Override - public void onValueChange(NumberPicker numberPicker, int from, int to) { - listener.onValueChangeInScrolling(self, from, to); + public void onValueChange(NumberPicker numberPicker, int oldVal, int newVal) { + if(listenerInScrolling != null) { + listenerInScrolling.onValueChangeInScrolling(self, oldVal, newVal); + } + // onValueChange is triggered also during scrolling. Since we don't want + // to send event during scrolling we make sure wheel is still. This particular + // case happens when wheel is tapped, not scrolled. + if(state == SCROLL_STATE_IDLE) { + sendEventIn500ms(); + } } }); - } - @Override - public void setOnValueChangedListener(final Picker.OnValueChangeListener listener) { - this.onValueChangedListener = listener; super.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChange(NumberPicker numberPicker, int nextState) { - boolean stoppedScrolling = state != SCROLL_STATE_IDLE && nextState == SCROLL_STATE_IDLE; - if (stoppedScrolling) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - listener.onValueChange(); - } - // the delay make sure the wheel has stopped before sending the value change event - }, 500); - } - state = nextState; + sendEventIfStopped(nextState); + state = nextState; } }); } + private void sendEventIfStopped(int nextState){ + boolean stoppedScrolling = state != SCROLL_STATE_IDLE && nextState == SCROLL_STATE_IDLE; + if (stoppedScrolling) { + sendEventIn500ms(); + } + } + + private void sendEventIn500ms(){ + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + onValueChangedListener.onValueChange(); + } + // the delay make sure the wheel has stopped before sending the value change event + }, 500); + } + }