IndexOutOfBounds在listview中滚动时堆栈跟踪中没有应用程序代码

时间:2013-02-05 09:46:18

标签: android listview simplecursoradapter indexoutofboundsexception


我发现了一些类似的问题,但无论指出什么问题似乎都不适用于此 我有一个带有MatrixCursor和SimpleCursorAdapter的ListView作为数据提供者。只有一个列表项样式,没有页眉或页脚左右。 当我快速上下滚动列表时,可能只有当弹跳到列表顶部时,有时我得到一个IndexOutOfBounds异常,而堆栈跟踪中没有任何应用程序代码。所以我甚至无法抓住它 这在华为Ideos U8510 / Android 2.3.3和Acer Iconia Tab A510 / Android 4.1.2上发生(至少经过测试)。 任何想法如何修复或规避赞赏。
T.i.a.

02-05 10:17:12.980: E/AndroidRuntime(1517): FATAL EXCEPTION: main
02-05 10:17:12.980: E/AndroidRuntime(1517): java.lang.ArrayIndexOutOfBoundsException
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.MotionEvent.getY(MotionEvent.java:903)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.widget.AbsListView.onTouchEvent(AbsListView.java:2189)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.widget.ListView.onTouchEvent(ListView.java:3486)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.View.dispatchTouchEvent(View.java:3885)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:942)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1693)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1125)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.app.Activity.dispatchTouchEvent(Activity.java:2096)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1677)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2257)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1881)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.os.Looper.loop(Looper.java:123)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at android.app.ActivityThread.main(ActivityThread.java:3695)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at java.lang.reflect.Method.invokeNative(Native Method)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at java.lang.reflect.Method.invoke(Method.java:507)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
02-05 10:17:12.980: E/AndroidRuntime(1517):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:2)

我通过重新实现ListView.onTouchEvent()修复了它。我以为我会分享代码:

public class MyListView extends ListView 
{

    public MyListView(Context context) 
    {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyle) 
    {
        super(context, attrs, defStyle);
    }

    @Override public boolean onTouchEvent(MotionEvent ev)
    {
        try { return super.onTouchEvent(ev); }
        catch(ArrayIndexOutOfBoundsException e)
        {
            Log.w("Catched ArrayIndexOutOfBoundsException");
            return true; // handled
        }       
    }   
}

你必须使用< Your.path.to.MyListView>而不是< ListView>在layout.xml文件中。

答案 1 :(得分:0)

程序正在尝试从特定索引处的ArrayArrayList访问元素,用于设置listView的适配器。但该指数的元素尚未初始化。

如果使用自定义适配器设置列表,请检查适配器类中的getCount()方法返回的内容。它应该返回您用于设置列表的ArrayArrayList的大小。