当在ListView中滚动太快时发生ArrayIndexOutOfBoundsException.Bug



所以我有这个自定义的ListView w/c有嵌入式OnSwipeLeftOnSwipeRight侦听器,并填充了TextViews数组。

我目前在App testing的舞台上,然后我在我的应用程序中发现了这个错误。错误发生时,我做滚动太快上下一次又一次

我在我的代码中的每个数组访问上放置了一个try-catch-block,但异常不会被捕获。

在我看来,错误发生时,我不小心点击一个ListView的项目,而它仍在滚动(事件发生在ListView的剪切边界之外?)

准确的错误日志:

06-20 17:29:47.063: D/AndroidRuntime(18336): Shutting down VM
06-20 17:29:47.063: W/dalvikvm(18336): threadid=1: thread exiting with uncaught exception (group=0x40015560)
06-20 17:29:47.092: E/AndroidRuntime(18336): FATAL EXCEPTION: main
06-20 17:29:47.092: E/AndroidRuntime(18336): java.lang.ArrayIndexOutOfBoundsException
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.MotionEvent.getY(MotionEvent.java:903)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.widget.AbsListView.onTouchEvent(AbsListView.java:2184)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.widget.ListView.onTouchEvent(ListView.java:3446)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.View.dispatchTouchEvent(View.java:3885)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1691)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1675)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2194)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1878)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.os.Handler.dispatchMessage(Handler.java:99)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.os.Looper.loop(Looper.java:123)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at android.app.ActivityThread.main(ActivityThread.java:3683)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at java.lang.reflect.Method.invokeNative(Native Method)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at java.lang.reflect.Method.invoke(Method.java:507)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-20 17:29:47.092: E/AndroidRuntime(18336):    at dalvik.system.NativeStart.main(Native Method)

我很确定它在SwipeListeners上因为如果我没有设置这个

listView.setOnTouchListener( new OnSwipeTouchListener(this) {
    public void onSwipeRight() {
        loadNextPage();
    }
    public void onSwipeLeft() {
        loadPrevPage();
    }
});

没有错误发生。


我所做的是摆脱它是我看SwipeListeners w/c的实现是完全

public class OnSwipeTouchListener implements OnTouchListener

然后改变这个默认值

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

错误消失了。但是这种工作仍然会在我未来的工作中困扰我,我想没有人会喜欢这样。我可能错过了什么?

如果你不使用ViewHolder模式那么你应该使用它,因为它使ListView滚动非常顺利通过重用视图。有几个很好的来源是:

    <
  1. 持有人模式/gh>
  2. 文档

希望有帮助。:)

最新更新