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 是什么意思,我假设您的 selectedItemListitemList 都属于不同的类型。如果他们拥有相同的类型,你可以

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

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