我的Android Listview适配器中的IndexOutOfBoundsException

时间:2015-03-12 17:03:43

标签: android listview indexoutofboundsexception

我一直得到这个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中的位置值通常可以高达六或七。

这里有人可以发现这个错误吗?任何帮助将不胜感激。

此致 肯尼斯

编辑1: *链接到使用以下内容的活动代码:https://github.com/kenneho/run-for-the-bus/blob/master/app/src/main/java/net/kenneho/runnow/InfoActivity.java *我已在此处粘贴了最相关的logcat部分:http://pastebin.com/5FtU4EaM

1 个答案:

答案 0 :(得分:1)

最后修复了错误。首先,我重构了@Selvin建议的代码。其次,我添加了一个“removecallback”-statement来在创建新的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);

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