2011-10-04 98 views
3

我有一个的ListView,我的ListView默认包含复选框的所有复选框,如果我们取消选中任何复选框的位置添加到mCheckedArrayList.i想删除列表视图,从取消选择所有位置。我用下面的代码进行核对,从ArrayList中移除对象?

for(int i=0;i<=mCheckedArrayList.size;i++){ 
    int removePosition=mCheckedArrayList.get(i); 
    mDisplayArrayList.remove(removePosition); 
} 

这是给ArrayIndexOutOfBounds exception.pls帮我

+1

发布您的完整代码。并不能理解你的问题。 –

回答

10

您正在删除错误的顺序的对象。你应该总是反向循环的顺序,如果你删除的循环中的元素:

for(int i = mCheckedArrayList.size()-1 ; i >= 0; i--){ 
    mDisplayArrayList.remove(mCheckedArrayList.get(i)); 
} 

作为一个侧面说明,如果你想通过前面的第一环(在你不删除元素的情况下),你将不得不将您的循环结束条件更改为以下内容:

i < mCheckedArrayList.size() 

感谢Martín发表评论。要意识到修改,您可以始终使用阵列的“最终参考”。

final ArrayList<T> arrayListToBeUsed = mCheckedArrayList; 
for(int i = arrayListToBeUsed .size()-1 ; i >= 0; i--){ 
    arrayListToBeUsed .remove(arrayListToBeUsed .get(i)); 
} 
+0

请注意您的列表是否被另一个线程修改。 –

+0

伟大的答案,只是一件事,我不能理解-1到arraylist大小来自哪里,谢谢。 –

+0

顶部索引大小为1,因为索引从0开始于Java – Moss

0

尝试在您的for循环中将'< ='更改为'<'。

0

在编程中,第一项从0开始,最后一个项目是在大小减去1

for(int i=0;i<=mCheckedArrayList.size;i++){ // <-- remove '=' 
2

从我的使用迭代观点是最正确的部分

ListIterator<Object> listIterator = mCheckedArray.listIterator();  
    for(;listIterator.hasNext() ; listIterator.next()){ 
     listIterator.remove(); 
    } 

它会还可以防止另一个线程将对象注入您的集合

3

无需采取任何迭代器。无需循环列表以从列表中删除对象。

以下行将简单地删除arraylist中的所有对象,并使其为空。

myArrayList.clear(); 
+0

它会删除元素或将它们设置为空? – bel