Android索引超出边界错误,堆栈跟踪中没有应用程序代码

时间:2011-11-24 11:54:54

标签: android listview

这是堆栈跟踪:

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
    at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
    at java.util.ArrayList.get(ArrayList.java:311)
    at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
    at android.widget.ListView.dispatchDrawWithExcessScroll_Default(ListView.java:3354)
    at android.widget.ListView.dispatchDraw(ListView.java:3054)
    at android.view.View.draw(View.java:6936)
    at android.widget.AbsListView.draw(AbsListView.java:3022)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.View.draw(View.java:6936)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.View.draw(View.java:6936)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
    at android.view.View.draw(View.java:6936)
    at android.widget.FrameLayout.draw(FrameLayout.java:357)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1904)
    at android.view.ViewRoot.draw(ViewRoot.java:1527)
    at android.view.ViewRoot.performTraversals(ViewRoot.java:1263)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    at dalvik.system.NativeStart.main(Native Method)

我完全不知道如何重现这个错误。我已尝试在我的应用程序的每个ListView上随机点击,但无法重现此错误。

这只发生在应用程序发布到市场之后。我以前从未见过这个错误。

最糟糕的是,它没有来自我的应用程序的代码,所以我甚至不知道用户在发生这种情况时做了什么。

有没有人见过这种错误?

有没有人知道从哪里开始修复它?

5 个答案:

答案 0 :(得分:15)

我也在运行Lollipop的Nexus 5上遇到了同样的例外。如果我:

会发生
  • 在显示列表时拔下设备
  • 让设备入睡
  • 重新插入设备,导致列表内容刷新

添加一个虚拟页脚没有修复它,它只是将错误更改为Invalid index 1, size is 1 :) ...但是由于@AlexD,我有一个线索,在哪里寻找解决方法。

在我的情况下,成功创建ListView后调用list.setFooterDividersEnabled(false)可以防止崩溃。

答案 1 :(得分:12)

当listview为空时我有同样的错误。查看源代码后,我发现了崩溃的行:

return mFooterViewInfos.get(adjPosition - adapterCount).isSelectable

正如您所看到的,没有检查mFooterViewInfos是否为空,因此我对此问题的解决方法只是添加一个虚拟页脚:

list.addFooterView(new View(context, null, false));

答案 2 :(得分:5)

如果您在三星手机上运行此功能,请查看此StackOverflow Q& A:

ListView random IndexOutOfBoundsException on Froyo

答案 3 :(得分:1)

也许迟到了,但我想我找到了解决办法。我们的想法是在离开之前删除headerView / footerView(取决于您使用的内容) 片段/活动:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ....
        getListView().addHeaderView(mHeaderView);
}


public void onDestroyView() {
    super.onDestroyView();
    if (getListView().getHeaderViewsCount() > 0) {
        getListView().removeHeaderView(mHeaderView);
    }
}

答案 4 :(得分:0)

也许你的活动被杀死然后被重新创建(例如当屏幕方向改变时),所以你的数组被初始化为零元素,而你的程序的其他部分却不知道它并期望该数组有一些元素。