所以我有这个自定义的ListView
w/c有嵌入式OnSwipeLeft
和OnSwipeRight
侦听器,并填充了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
滚动非常顺利通过重用视图。有几个很好的来源是:
- <
- 持有人模式/gh>
- 文档
希望有帮助。:)