我的Android Listview适配器出现了IndexOutOfBoundsException异常。

7
我一直遇到IndexOutOfBoundsException,但似乎找不出原因。我的listview有一个带有对象列表的适配器,并且基于时间戳删除对象。删除是在getView方法内完成的。一旦删除了一个项目,我就调用notifyDataSetChanged()。
完整的源代码可在github上获得,这里是listview适配器代码的链接:https://github.com/kenneho/run-for-the-bus/blob/master/app/src/main/java/net/kenneho/runnow/adapters/TravelsAdapter.java 这是我一直遇到的堆栈跟踪的开头:
java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
at java.util.ArrayList.get(ArrayList.java:308)
at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
at android.widget.ListView.dispatchDraw(ListView.java:3307)
at android.view.View.draw(View.java:15213)
<snip>

我看到在getView中,position-value的值通常会高达六或七。

有谁能发现这个错误?任何帮助都将不胜感激。

祝好, 肯尼斯

编辑1: * 使用该代码的活动链接:https://github.com/kenneho/run-for-the-bus/blob/master/app/src/main/java/net/kenneho/runnow/InfoActivity.java * 下面是最相关的日志部分:http://pastebin.com/5FtU4EaM


你正在尝试访问一个空的ArrayList。请发布一些代码。 - VERT9x
你应该同时发布LogCat,因为代码中有一些有用的Log调用。如果你通过调试器逐步执行代码,那么你应该知道哪段代码引起了异常。 - The Original Android
@Selvin,你认为我应该如何将从适配器中删除条目的代码放置? - kenneho
我重构了我的代码,以便在适配器本身之外删除条目,但仍然遇到IndexOutOfBoundsException。在最新的logcat(http://pastebin.com/13kQm74q)中,我发现了一件有趣的事情,尽管我的手机整夜都处于非活动状态 - 以一秒间隔运行的Runnable执行突然大量出现。请注意http://pastebin.com/13kQm74q上的时间戳。有什么想法,为什么Runnable线程突然会爆发? - kenneho
顺便说一下,我刚刚在onPause()中添加了“timerHandler.removeCallbacks(timerRunnable);”,并在onResume()中添加了“timerHandler.postDelayed(timerRunnable, 1000);”。我猜想这个Runnable可能是(部分)bug的原因。 - kenneho
显示剩余4条评论
1个回答

1

最终问题已经解决。首先,我按照@Selvin的建议重构了代码。其次,在创建新的Runnables之前,我添加了一个“removecallback”语句来停止任何现有的Runnables:

// Make sure we stop existing timers, if any.
timerHandler.removeCallbacks(timerRunnable);

timerRunnable = new Runnable() {

   @Override
   public void run() {
      removeExpiredTravels(myAdapter);
      myAdapter.notifyDataSetChanged();
      timerHandler.postDelayed(this, 1000);
   }
};

timerHandler.postDelayed(timerRunnable, 0);

感谢您帮助我追踪此错误。

你写了这个getView()吗? - Harshad Madaye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接