list.remove()在回收站错误
问题描述:
我有列表,每一行都有复选框,我试着让所有的复选框位置,然后循环它并删除每一行list.remove(indexOfpostion) ,但它会抛出java。 lang.IndexOutOfBoundsExceptionlist.remove()在回收站错误
注意:我的列表名称是“Dish”。
代码:
public void removeAtAll() {
Iterator it = selectedCheckBox.entrySet().iterator();
if(!it.hasNext()){
new makeDialog().makeDialog(mContext,mContext.getResources().getString(R.string.share_no_data));
}
else {
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
int key = (Integer) pair.getKey();
if ((Boolean) pair.getValue()) {
// it.remove();
DishToDel.add(dish.get(key).getDishID());
}
}
//
for (Object o : selectedCheckBox.entrySet()) {
Map.Entry pair2 = (Map.Entry) o;
int key2 = (Integer) pair2.getKey();
if ((Boolean) pair2.getValue()) {
dish.remove(getItem(key2)); // error here
notifyItemRemoved(key2);
notifyItemRangeChanged(key2, dish.size());
}
}
chooseAllradioButton.setSelected(false);
favhtask = new FavAsyncTaskDelete(mContext, DishToDel);
favhtask.execute();
}
// process message deleteing
}
错误日志
FATAL EXCEPTION: main
Process: com.TopLine.nokhbatalatbaq, PID: 32327
java.lang.IndexOutOfBoundsException: Index: 2, Size: 1
at java.util.ArrayList.get(ArrayList.java:411)
at com.TopLine.nokhbatalatbaq.adapter.FavAdapterDishes.removeAtAll(FavAdapterDishes.java:344)
at com.TopLine.nokhbatalatbaq.adapter.FavAdapterDishes$4.onClick(FavAdapterDishes.java:151)
at android.view.View.performClick(View.java:6205)
at android.view.View$PerformClick.run(View.java:23653)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
答
您使用dish.remove(getItem(key2))
,而你遍历条目集,这是我没有料想到会抛出ConcurrentModificationException
删除从入门集的项目,但显然你有一些List
,你没有告诉我们,也许是使用getItem
,你也没有告诉我们,所以也许这就是为什么IndexOutOfBoundsException
。
另外,你为什么要调用一个静态方法DishToDel
?这看起来应该是一种实例方法的调用方式。
通常情况下,您应该能够在单个基于迭代器的循环中进行循环移除,但您有太多复杂的事情,无法确切知道您要做什么。
独立创作的任何
new makeDialog().makeDialog(mContext,mContext.getResources().getString(R.string.share_no_data));
试图从方法removeAtAll
创建和结果分配给的东西,或者某个地方传递,所以它不只是一个无用线。方法应该有一个单一的目的,而不是多个目标,特别是没有矛盾的目的。
一旦你清理了你的代码,你会发现诊断任何错误并为它们寻求帮助要容易得多。如果您确实寻求帮助,请举一个完整的示例来说明您的问题。不要压制所有相关信息。
不要使用原始类型!
你可以添加错误日志吗? – Carlton
完成后,请注意,我的菜单列表当它有三个选定的框,然后在最后一个尝试从列表中删除它尝试获取位置= 2,但列表现在只有一个元素在位置0,所以如何删除一些我的列表中的行只有一次? –
你的getItem最有可能做什么,这种方法无法在列表缩小时自行调整,但它是唯一的假设。 –