java - setMultiChoiceItems 单击时 IndexOutOfBoundsException

标签 java android arraylist android-alertdialog indexoutofboundsexception

我正在使用带有多个选项的对话框。一旦用户单击某个项目,itemsList 中的项目就会被添加到 selectedItemsList 中,当然,当用户取消选择某个项目时,该项目将从中删除selectedItemsList

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

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

...

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

代码 fragment :

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

最佳答案

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

            selectedItemsList.remove(which);

你需要

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

或者类似的东西

但是 getItemWithId 将不存在。我不太确定 itemsList.getItem 的意思,我假设您的 selectedItemListitemList 都拥有不同的类型。如果它们拥有相同的类型,您可以

        selectedItemsList.remove(itemsList.get(which))

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

关于java - setMultiChoiceItems 单击时 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37349265/

相关文章:

java - 如何为服务器端的每个 websocket session 创建相互映射?

java - 使用 Java 创建 excel

android - 在使用 Robolectric 测试 Activity 时模拟 SQLite 数据库

android - 在 firebase 中维护动态计算的值

java - 无法从数组列表中删除元素

java - 从文本文件读取并创建对象数组 Java

java - 是否可以创建一个包含 arraylist 对象的常规数组?

java - itext 7.1.2% 表宽度

java - 如何管理列表中项目运行 "Activity for result"的状态?

android - 布局预览与模拟器或手机不匹配