1


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

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)
4

2 回答 2

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
        }       
    }   
}

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

于 2013-02-08T09:18:50.063 回答
0

该程序正在尝试从特定索引处访问Array或您用于设置listView 的适配器的元素。ArrayList但是该索引处的元素尚未初始化。

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

于 2013-02-05T09:52:05.433 回答