【问题标题】:Encountered IndexOutOfBoundException while removing items from ListView in Android?从 Android 中的 ListView 中删除项目时遇到 IndexOutOfBoundException?
【发布时间】:2011-04-01 07:12:54
【问题描述】:

我的布局中有一个 simple_list_item_multiple_choice 列表视图,我正在尝试从中删除所有选定的项目。我知道如何删除它,但我在删除项目时遇到了两个主要问题:-

  1. 我的程序不会删除超过 2 个项目,例如如果我选择了 4 个项目,那么只会删除 2 个项目,有时甚至会删除错误的项目。

  2. 当我调试我的代码时,我在我的代码中发现了 Array IndexOutOfBoundException,据我所知,我的代码中没有这样的异常,这都是因为删除错误或更少项目。

这是我的代码:-

public void onClick(View view)
{
    SparseBooleanArray checkedPositions = new SparseBooleanArray();
    checkedPositions.clear();
    checkedPositions = lv.getCheckedItemPositions();
    int size = checkedPositions.size();
    if(size != 0)
    {
        try
        {
        for(int i = 0; i < size; i++)
        {
            if(checkedPositions.valueAt(i))
            {
                list.remove(checkedPositions.keyAt(i));
                notes.notifyDataSetChanged();
                lv.setItemChecked(i,false);
            }
        }}catch (IndexOutOfBoundsException ie)
        {}
    }
        else{}
}

我仅出于调试目的才捕获该异常。在此先感谢,但请帮忙,因为从过去两天开始我就一直卡在这部分。

【问题讨论】:

  • 应该是 i
  • @m0s 我也试过了,我什至试过 i = 1, size + 1, size -1 或者可以对循环进行所有可能的更改。还是行不通。异常仍然存在。 :(
  • 您应该检查导致异常的原因,list.remove(...) 或 checkedPositions.valueAt(...)。而且它不是很清楚什么是列表以及它是如何初始化的
  • m0s 我已经发布了更多代码,如果您发现错误并且我刚刚发现了一些东西,请看一下,也许它可以帮助您找到错误; keyAt() :- 给定 0...size()-1 范围内的索引,返回此 SparseBooleanArray 存储的第索引键值映射中的键。可能是因为这个 size()-1 我遇到了这个问题。你怎么看?

标签: android listview selected items


【解决方案1】:

每次从较低杠杆的数组中删除一个项目时,总计数会减少 1。如果要删除 4 个项目 [0,1,2,3],并且删除以 item 开头的项目0,你有 [0, 1, 2],然后你删除 1 处的项目,你有 [0, 1],如果你尝试删除不存在的索引 2 处的项目,你会得到一个错误。尝试倒计时而不是像这样倒计时

for(int i = size; i > 0; --i)
{
  if(checkedPositions.valueAt(i))
  {
    list.remove(checkedPositions.keyAt(i));
    notes.notifyDataSetChanged();
    lv.setItemChecked(i,false);
  }
}

【讨论】:

  • 好的,正如你建议的那样,我试过了,但是当我尝试删除三个项目时,它只删除了两个,当我尝试删除四个项目时,再次遇到 IOOBException 并不得不强制关闭我的应用程序。 :(
  • 尝试注释掉这一行,看看是不是报错 //lv.setItemChecked(i,false);
  • 试过了仍然得到这个 java.lang.IndexOutOfBoundsException: Invalid index 11, size is 11
  • 好的,我尝试了一些愚蠢的事情,这似乎是迄今为止我所做的最好的工作尝试,我将 i>-1 传递给了循环,并且在我尝试删除最后两个项目之前一切正常左。这次它给了我 java.lang.IndexOutOfBoundsException: Invalid index 4, size is 2 有什么建议吗?
【解决方案2】:
for(int i = size-1 ; i >= 0; i--) 
{
  if(checkedPositions.valueAt(i))
  {
    list.remove(checkedPositions.keyAt(i));
    //lv.setItemChecked(checkedPositions.keyAt(i),false);
  }
}
notes.notifyDataSetChanged();

【讨论】:

  • 我认为有时您的 IndexOutOfBoundsException 发生在 checkPositions.keyAt(i) 调用 [如果您初始化循环错误] 有时它与 list.remove(#blah#) 调用 [如果你已经删除了一些元素]这使得调试变得混乱。
  • 如果这仍然不起作用,请尝试执行以下操作: int temp = checkedPositions.keyAt(i); list.remove(temp);这样您就可以调试哪个部分出现问题了。
  • @Kharles 伙计,您的解决方案很有效,但是当我尝试一次删除所有项目时,它再次开始给我 IOOBException。
  • 它可能是最后一行:lv.setItemChecked(checkedPositions.keyAt(i),false);现在把它注释掉,它不应该出错
  • 如果您要删除该项目,您可能不需要取消选中它?
【解决方案3】:

从外观上看,你应该改变这个

for(int i = 0; i <= size; i++)

for(int i = 0; i < size; i++)

【讨论】:

  • Sted 我也试过了,还是不行。我尝试了对该循环进行的所有可能更改。 :(
  • 哪一行正好给了你IndexOutOfBoundException?它是否发生在 list.remove(checkedPositions.keyAt(i)) ?
  • 是的 SteD 我在这一行有错误,因为 keyAt() 返回 size()-1 索引,这肯定是我的代码中的问题,但我不知道如何删除这个错误.有什么解决办法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2010-11-22
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多