1

我有一个带有 onListItemListener 的 ListView,我有它,所以如果你点击一个 ListView 项目,它会删除它,但由于某种原因,如果我从列表中删除最后一个项目,应用程序会崩溃并给我这个错误(java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3)

有谁知道这意味着什么?

这是我的代码:

 @Override  
        protected void onListItemClick(ListView l, View v, int pos, long id) {  
            super.onListItemClick(l, v, pos, id);
            adapter.remove(adapter.getItem(pos));
            adapter.notifyDataSetChanged();
        } 
4

4 回答 4

4

我假设您将 pos = 3 作为参数值传递。因为列表的大小是 3,所以最后一个元素的位置应该是 2。

*编辑:

请记住,listview 和适配器的起始索引是不同的。ListView 项 pos 从“1”作为第一个位置开始,适配器(例如数组)从索引“0”作为第一个位置开始。

adapter.remove(adapter.getItem(pos-1)); 
于 2013-02-26T02:59:35.867 回答
1

我相信我已经弄清楚了,所有说pos变量是一个数字太高的答案似乎都是合乎逻辑的,但是我都尝试了它们,但它们都不起作用。

似乎出了什么问题,当我从列表中删除最后一项时,它会尝试刷新 ListView 但里面没有任何东西可以刷新,因此应用程序会崩溃,我稍微更改了代码位,现在效果很好!:) 我不完全理解它为什么有效,但它确实有效!

感谢所有的答案家伙!

@Override  
    protected void onListItemClick(ListView l, View v, int pos, long id) {  
        super.onListItemClick(l, v, pos, id);

        if (adapter.getCount() != adapter.getItemId(pos)) {
           adapter.remove(adapter.getItem(pos));
           adapter.notifyDataSetChanged();     
       }        
}  
于 2013-02-26T03:26:44.310 回答
0

根据文档,您应该一直使用 id 作为删除项目的值。

像这样:

adapter.remove(adapter.getItem(id));
于 2013-02-26T03:06:29.240 回答
0

请尝试以下操作:如果 lsitview 中有 4 个项目,则 lat 项目将位于索引 3 处,第一个将位于索引 0 处。

@Override  
        protected void onListItemClick(ListView l, View v, int pos, long id) {  
            super.onListItemClick(l, v, pos, id);
            adapter.remove(adapter.getItem(pos-1));
            adapter.notifyDataSetChanged();
        } 
于 2013-02-26T06:28:44.043 回答