johannilsson/android-pulltorefresh

IllegalArgumentException: historyPos out of range

quiffman opened this issue · 4 comments

On android 3.2 - both Galaxy 10.1 and Acer A100, I see this behaviour when pulling to refresh:

E/AndroidRuntime(14918): FATAL EXCEPTION: main
E/AndroidRuntime(14918): java.lang.IllegalArgumentException: historyPos out of range
E/AndroidRuntime(14918):    at android.view.MotionEvent.nativeGetAxisValue(Native Method)
E/AndroidRuntime(14918):    at android.view.MotionEvent.getHistoricalY(MotionEvent.java:1828)
E/AndroidRuntime(14918):    at com.markupartist.android.widget.PullToRefreshListView.applyHeaderPadding(PullToRefreshListView.java:224)
E/AndroidRuntime(14918):    at com.markupartist.android.widget.PullToRefreshListView.onTouchEvent(PullToRefreshListView.java:195)
E/AndroidRuntime(14918):    at android.view.View.dispatchTouchEvent(View.java:4609)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1554)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1320)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560)
E/AndroidRuntime(14918):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1333)
E/AndroidRuntime(14918):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1732)
E/AndroidRuntime(14918):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1267)
E/AndroidRuntime(14918):    at android.app.Activity.dispatchTouchEvent(Activity.java:2315)
E/AndroidRuntime(14918):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1705)
E/AndroidRuntime(14918):    at android.view.View.dispatchPointerEvent(View.java:4677)
E/AndroidRuntime(14918):    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2392)
E/AndroidRuntime(14918):    at android.view.ViewRoot.handleMessage(ViewRoot.java:2054)
E/AndroidRuntime(14918):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(14918):    at android.os.Looper.loop(Looper.java:132)
E/AndroidRuntime(14918):    at android.app.ActivityThread.main(ActivityThread.java:4123)
E/AndroidRuntime(14918):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(14918):    at java.lang.reflect.Method.invoke(Method.java:491)
E/AndroidRuntime(14918):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
E/AndroidRuntime(14918):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
E/AndroidRuntime(14918):    at dalvik.system.NativeStart.main(Native Method)

FWIW - I wonder if applyHeaderPadding should check getHistorySize - the following patch appears to solve the issue for me.

diff --git a/pulltorefresh/src/com/markupartist/android/widget/PullToRefreshListView.java b/pulltorefresh/src/com/markupartist/android/widget/PullToRefreshL
index e44db80..5ae52cc 100644
--- a/pulltorefresh/src/com/markupartist/android/widget/PullToRefreshListView.java
+++ b/pulltorefresh/src/com/markupartist/android/widget/PullToRefreshListView.java
@@ -203,7 +203,7 @@ public class PullToRefreshListView extends ListView implements OnScrollListener
         // (it's always 1 in 1.5)
         int pointerCount = 1;
         try {
-            Method method = MotionEvent.class.getMethod("getPointerCount");
+            Method method = MotionEvent.class.getMethod("getHistorySize");
             pointerCount = (Integer)method.invoke(ev);
         } catch (NoSuchMethodException e) {
             pointerCount = 1;

Goot catch! but do you know if this fix only applies to tablets, or only from a specific Android version up? I just received a report on the market with this error and I'd like to apply the fix, but since my app is available for 1.6 devices as well I don't want to cause a break for other people...

Great finding. Would you like to send a pull request with the change or would you like me to just patch it?

If it's enough to use getHistorySize I guess we can skip the reflection part as well. Need to investigate that further.