setMultiChoiceItems 上的 IndexOutOfBoundsException 单击
IndexOutOfBoundsException on setMultiChoiceItems click
我正在使用一个包含多个选项的对话框。一旦用户点击一个项目,来自 itemsList
的项目将被添加到 selectedItemsList
,当然当用户取消选择一个项目时,该项目将从 selectedItemsList
中删除.
使用 Monkey 测试我的应用时。我收到这些错误:
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
...
java.lang.IndexOutOfBoundsException: Invalid index 4, size is 3
片段:
List<Item> itemsList; // this list is populated before accessing
List<SelectedItem> selectedItemsList;
...
dialogBuilder.setMultiChoiceItems(playlists, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
selectedItemsList.add(new SelectedItem(itemsList.get(which).getId()));
} else if (selectedItemsList.get(which) != null) {
selectedItemsList.remove(which);
}
}
});
我可以通过检查 which
是否小于 selectedItemsList.size()
来 'solve'。但据我所知,如果这个 returns 是假的;该项目不会从 selectedItemsList
中删除,但复选框会被取消选中。这导致一切都会混淆
您可以 select 从中删除的列表大小与您要从中删除的列表大小不同,因此
selectedItemsList.remove(which);
你需要
selectedItemsList.remove(selectedItemsList.getItemWithId(itemsList.get(which).getID())
或类似的东西
getItemWithId
将不存在。我不太确定您所说的 itemsList.getItem
是什么意思,我假设您的 selectedItemList
和 itemList
都属于不同的类型。如果他们拥有相同的类型,你可以
selectedItemsList.remove(itemsList.get(which))
如果这没有意义,post 您的 SelectedItem class 以及您创建两个列表的位置,我将能够进一步提供帮助。
我不得不为 SelectedItem
class
覆盖 equals()
方法
更新的代码段:
List<Item> itemsList; // this list is populated before accessing
List<SelectedItem> selectedItemsList;
...
dialogBuilder.setMultiChoiceItems(playlists, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
selectedItemsList.add(itemsList.get(which).getSelectedItem());
} else if (selectedItemsList.get(which) != null) {
selectedPlaylists.remove(itemsList.get(which).getSelectedItem());
}
}
});
SelectedItem.class
...
@Override
public boolean equals(Object o) {
return (this.id.equals(((SelectedItem) o).getId()));
}
Item.class
...
public SelectedItem getSelectedItem() {
return new SelectedItem(id);
}
注意:我遗漏了一些代码。
我正在使用一个包含多个选项的对话框。一旦用户点击一个项目,来自 itemsList
的项目将被添加到 selectedItemsList
,当然当用户取消选择一个项目时,该项目将从 selectedItemsList
中删除.
使用 Monkey 测试我的应用时。我收到这些错误:
java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3
...
java.lang.IndexOutOfBoundsException: Invalid index 4, size is 3
片段:
List<Item> itemsList; // this list is populated before accessing
List<SelectedItem> selectedItemsList;
...
dialogBuilder.setMultiChoiceItems(playlists, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
selectedItemsList.add(new SelectedItem(itemsList.get(which).getId()));
} else if (selectedItemsList.get(which) != null) {
selectedItemsList.remove(which);
}
}
});
我可以通过检查 which
是否小于 selectedItemsList.size()
来 'solve'。但据我所知,如果这个 returns 是假的;该项目不会从 selectedItemsList
中删除,但复选框会被取消选中。这导致一切都会混淆
您可以 select 从中删除的列表大小与您要从中删除的列表大小不同,因此
selectedItemsList.remove(which);
你需要
selectedItemsList.remove(selectedItemsList.getItemWithId(itemsList.get(which).getID())
或类似的东西
getItemWithId
将不存在。我不太确定您所说的 itemsList.getItem
是什么意思,我假设您的 selectedItemList
和 itemList
都属于不同的类型。如果他们拥有相同的类型,你可以
selectedItemsList.remove(itemsList.get(which))
如果这没有意义,post 您的 SelectedItem class 以及您创建两个列表的位置,我将能够进一步提供帮助。
我不得不为 SelectedItem
class
equals()
方法
更新的代码段:
List<Item> itemsList; // this list is populated before accessing
List<SelectedItem> selectedItemsList;
...
dialogBuilder.setMultiChoiceItems(playlists, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked) {
selectedItemsList.add(itemsList.get(which).getSelectedItem());
} else if (selectedItemsList.get(which) != null) {
selectedPlaylists.remove(itemsList.get(which).getSelectedItem());
}
}
});
SelectedItem.class
...
@Override
public boolean equals(Object o) {
return (this.id.equals(((SelectedItem) o).getId()));
}
Item.class
...
public SelectedItem getSelectedItem() {
return new SelectedItem(id);
}
注意:我遗漏了一些代码。