单击setMultiChoiceItems上的IndexOutOfBoundsException

时间:2016-05-20 14:24:04

标签: java android arraylist alertdialog indexoutofboundsexception

我正在使用包含多个选项的对话框。用户点击某个项目后,itemsList中的项目会被添加到selectedItemsList,当然,当用户取消选择某个项目时,该项目将从selectedItemsList中删除

使用{{3}}测试我的应用时。我收到了这些错误:

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);
            }

        }
    });

我可以解决&#39;检查which是否小于selectedItemsList.size()。但据我所知,如果这返回错误;该项目不会从selectedItemsList中删除,但该复选框将取消选中。这导致一切都会混淆

2 个答案:

答案 0 :(得分:2)

您可以从中选择的列表大小与您要删除的列表的大小相同,因此不是

            selectedItemsList.remove(which);

你需要

            selectedItemsList.remove(selectedItemsList.getItemWithId(itemsList.get(which).getID())

或类似的东西

虽然getItemWithId不存在。我不确定itemsList.getItem是什么意思,我假设你的selectedItemListitemList都有不同的类型。如果他们保持相同的类型,你可以

        selectedItemsList.remove(itemsList.get(which))

如果这没有意义,请发布您的SelectedItem类以及创建两个列表的位置,并且我将能够进一步提供帮助。

答案 1 :(得分:0)

我必须覆盖public static void main(String[] args)

equals()方法

更新了代码段

SelectedItem

<强> SelectedItem.class

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());
                    }

                }
        });

<强> Item.class

    ...

    @Override
    public boolean equals(Object o) {
        return (this.id.equals(((SelectedItem) o).getId()));
    }

注意:我遗漏了一些代码。