【问题标题】:IndexOutOfBoundsException on setMultiChoiceItems click在 setMultiChoiceItems 上单击 IndexOutOfBoundsException
【发布时间】:2016-05-20 14:24:04
【问题描述】:

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

使用Monkey 测试我的应用程序时。我收到这些错误:

java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3

...

java.lang.IndexOutOfBoundsException: Invalid index 4, size is 3

sn-p:

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() 来“解决”这个问题。但据我所知,如果这返回错误;该项目不会从selectedItemsList 中删除,但复选框将被取消选中。这导致一切都会混淆

【问题讨论】:

  • 我猜,Arraylist 从 0 开始,onClick 的整数值从 1 开始。如果你的 onClick 整数值大于 ArrayList 的大小,那么可能会抛出 IndexOutOfBound 异常。尝试使用 .get(which-1)/.remove(which-1)。
  • @HariRam 我刚刚测试过了,onClick的整数值从0开始.. :(
  • 检查 LIST 的大小。

标签: java android arraylist android-alertdialog indexoutofboundsexception


【解决方案1】:

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

            selectedItemsList.remove(which);

你需要

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

或类似的东西

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

        selectedItemsList.remove(itemsList.get(which))

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

【讨论】:

  • 感谢您为我指明正确的方向。我遗漏了一些代码,忘记删除 itemsList.getItem。我已经解决了这个问题,请查看我更新的问题和我的答案。
【解决方案2】:

我不得不为 SelectedItem 类覆盖 equals() 方法

更新的 sn-p:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2016-06-05
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多