2011-08-05 34 views
3

我刚刚得到一个奇怪的IndexOutOfBoundsException异常,我似乎无法重现。它似乎与我的列表活动有关:IndexOutOfBoundsException异常与列表视图

java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1 
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257) 
at java.util.ArrayList.get(ArrayList.java:311) 
at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:229) 
at android.widget.AbsListView.obtainView(AbsListView.java:1410) 
at android.widget.ListView.makeAndAddView(ListView.java:1802) 
at android.widget.ListView.fillDown(ListView.java:727) 
at android.widget.ListView.fillSpecific(ListView.java:1359) 
at android.widget.ListView.layoutChildren(ListView.java:1633) 
at android.widget.AbsListView.onLayout(AbsListView.java:1263) 
at android.view.View.layout(View.java:7088) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
at android.view.View.layout(View.java:7088) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:334) 
at android.view.View.layout(View.java:7088) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:334) 
at android.view.View.layout(View.java:7088) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:334) 
at android.view.View.layout(View.java:7088) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:334) 
at android.view.View.layout(View.java:7088) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:334) 
at android.view.View.layout(View.java:7088) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
at android.view.View.layout(View.java:7088) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:334) 
at android.view.View.layout(View.java:7088) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
at android.view.View.layout(View.java:7088) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:334) 
at android.view.View.layout(View.java:7088) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:334) 
at android.view.View.layout(View.java:7088) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1056) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1752) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
at dalvik.system.NativeStart.main(Native Method) 

我在想这可能与我如何添加/删除脚注有关。下面是该代码:

private void setLoadMoreFooter() { 
    resumeProgressBarAnimation(progressbar); 
    if (getListView().getFooterViewsCount() != 0 || currentCategory == null) { 
     try { 
      getListView().removeFooterView(footerView); 
     } catch (ClassCastException e) { 
     } 
    } 
    cursor = getVouchersFromDatabase(); 
    Log.d(TAG, "Determining FOOTER status:\nCurrent page size: " + cursor.getCount()%10 + "\nCurrent category: " + currentCategory + "\nPage: " + currentCategory.getPage()); 
    // Add footer if there are 10 vouchers on the current page 
    if (cursor.getCount()%10 == 0 && currentCategory != null) { 
     getListView().addFooterView(footerView, null, true); 
    } 
    else if (currentCategory.getPage() >= 2 && cursor.getCount()%10 != 0) { 
     getListView().addFooterView(footerView, null, false); 
    } 
} 

通过源代码来看,错误似乎在headerviewlistadapter的getview方法在这行抛出:

return mHeaderViewInfos.get(position).view; 

有谁知道这样做的原因可能?

+0

我们需要看到的代码 –

+0

我们可以看到的headerviewlistadapter的代码? – Pikaling

+0

什么是位置和什么是mHeaderViewInfos.size()? – CrackerJack9

回答

0

通过在谷歌网站上的代码看后,我看到了很多不同类型的初始化的,并接入到mHeaderViewInfos,但我没有真正看到被添加到任何东西。抛出一些调试点并追踪它可能会有所帮助。祝你好运!

+1

感谢您的回复。我试图隐藏listview onstop,并使其再次onrestart可见,我从未遇到它。 –

0

使用addFooterView(footerView)这将是解决这一问题。

0

@Kevin邱提示隐藏的东西帮助。我只需要隐藏headerview,而不是整个列表。这里是为我工作的代码,假定头视图命名为mHeaderView
@Override public void onStop() { super.onStop(); mHeaderView.setVisibility(View.GONE);// fixes weird bug with header view }

,并确保它显示了你切换到不同的应用程序后,执行下面的代码。
@Override public void onStart() { if(mHeaderView.getVisibility() == View.GONE) mHeaderView.setVisibility(View.VISIBLE); super.onStart(); }

1

我解决了这个问题,确保在数据集更改时通知适配器。 在我的情况下,数据被另一个线程改变,列表视图检查后,如果数据是正确的。 查看listview源代码后。我发现那位例外扔在这里:

public View More ...getView(int position, View convertView, ViewGroup parent) { 
    // Header (negative positions will throw an ArrayIndexOutOfBoundsException) 
    int numHeaders = getHeadersCount(); 
    if (position < numHeaders) { 
     return mHeaderViewInfos.get(position).view; 
    } 

    // Adapter 
    final int adjPosition = position - numHeaders; 
    int adapterCount = 0; 
    if (mAdapter != null) { 
     adapterCount = mAdapter.getCount(); 
     if (adjPosition < adapterCount) { 
      return mAdapter.getView(adjPosition, convertView, parent); 
     } 
    } 

    // Footer (off-limits positions will throw an ArrayIndexOutOfBoundsException) 
    return mFooterViewInfos.get(adjPosition - adapterCount).view; 
} 

所以你可以看到,mFooterViewInfos.get(adjPosition - adapterCount)。查看抛出IndexOutOfBoundsException异常。因为位置大于listview认为它会。

你要做的就是找出引起这个异常的那个视图。并确保一旦数据改变立即通知适配器!

+0

这帮了我,我的问题解决了,原因是数据是一个全局变量,并在网络请求中的某个地方被改变。 (只有android 6.0报告这个bug,所以我认为刷新机制与之前有些不同。) – herbertD

0

我遇到了同样的问题,当使用ListView与标题视图或页脚视图添加/删除。所以尝试了Stack Overflow的不同方法,我找到了一个解决方案来忽略这个处理dispatchDraw方法的错误,如下所示。

public class CustomListView extends ListView{ 

    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     try { 
      super.dispatchDraw(canvas); 
     } catch (IndexOutOfBoundsException e) { 
      Log.e("luna", "Ignore list view error ->" + e.toString()); 
     } 
    } 
} 

希望能帮助你。

请参考此链接How to debug Android java.lang.IndexOutOfBoundsException HeaderViewListAdapter.java line

乐趣@。@

相关问题