当前位置: 首页 > 知识库问答 >
问题:

从适配器[closed]中的列表中删除未选择的数据时发生ArrayIndexOfBound异常

鲁财
2023-03-14

适配器代码:

当选中on复选框时

 pickHolder.selectItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (pickHolder.edtMoveQty.getText().length() <= 0) {
                    Utils.alertDialogShow(context, "Please enter move qty");
                } else {
                    TrolleyTransferResponse trolleyTransferResponse = new TrolleyTransferResponse();
                    trolleyTransferResponse.setItem(trolleyList.get(i).getItem());
                    trolleyTransferResponse.setMoveQty(trolleyList.get(i).getMoveQty());
                    if(isChecked) {
                        moveItems.add(trolleyTransferResponse);
                    }else {
                        moveItems.remove(i);
                    }
                    pickItemClickListener.onClickPickingItem(moveItems);
                }
            }
        });

共有1个答案

漆雕彦
2023-03-14

问题:

这里的问题是您正在使用moveItems列表向用户显示复选框列表。同时,在勾选或取消勾选时,您将从已显示给用户的列表中添加或删除项目。假设您正在取消选中索引5处的项,并且在取消选中该代码moveItems.Remove(i)时,您已经从列表中删除了该项,但UI仍将该项显示给用户。现在,您在UI上显示的复选框列表是相同的,但实际上,您的moveItems大小少了一个,因为您已经从moveItems列表中删除了一个项,所以当您尝试选中或取消选中最后一个项时,您在arraylist的索引上没有找到任何项,因此出现此异常。

解决方案:

或者尝试其他解决方案,如果您想要编辑相同的列表而不是使用其他列表,那么您应该在您的TrolleyTransferResponse类中添加一个布尔字段,默认情况下该字段为false,在选择时您将使该特定对象为true,而不是使用ArrayList的set方法添加或删除该字段。最后,使用for循环获取那些选择了true字段的对象。

 class TrolleyTransferResponse{
    private boolean selected;

    public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }


}

现在在适配器中

pickHolder.selectItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (pickHolder.edtMoveQty.getText().length() <= 0) {
                    Utils.alertDialogShow(context, "Please enter move qty");
                } else {
                    TrolleyTransferResponse trolleyTransferResponse = new TrolleyTransferResponse();
                    trolleyTransferResponse.setItem(trolleyList.get(i).getItem());
                    trolleyTransferResponse.setMoveQty(trolleyList.get(i).getMoveQty());
                    if(isChecked) {
                        trolleyTransferResponse.setSelected(true)
                        moveItems.set(i,trolleyTransferResponse);
                    }else {
                        trolleyTransferResponse.setSelected(false)
                        moveItems.set(i,trolleyTransferResponse);
                    }
                    pickItemClickListener.onClickPickingItem(moveItems);
                }
            }
        });

现在要取

for(int i=0;i<moveItems.size();i++){
 if(moveItems.get(i).isSelected)
{
  // do your code here 
  // you can also populate another list here so that list will have items only with checked true.
}
}
 类似资料:
  • 我有一个用于recyclerview的复选框,当我选择复选框数据时应该添加,当取消选择复选框数据时应该从列表中删除,但最后索引给出java.lang.IndexOutOfBoundsException:index:2,Size:1 at line MoveItems.Remove(I); 当选中on复选框时

  • 我有一个Windows Phone应用程序,其中一个ListPicker绑定到一个ObservableCollection和一个选定的项目: 在ViewModel中: 当我试图从按钮处理程序的列表中删除所选项目时,我得到一个InvalidOperationException(SelectedItem必须始终设置为有效值): 我希望将SseltedCon条件设置为null(这实际上是列表中的第一个项

  • 我是JSP的新手,我正在尝试创建一个web界面,用户可以在该界面中输入他们想要删除的信息,并且该信息将在数据库表中删除。 在这里,他们应该输入和,然后应该删除具有两个指定ID的任何数据。但是,它不是从表中删除的。我有个例外 数组索引越界 下面是我的代码:

  • 我有一个带有自定义适配器的 GridView,当我从列表中选择一个项目时,选择器会显示一秒钟并消失。我猜自定义适配器会导致它,我尝试使用它和选择器,但无济于事。 下面是我的适配器(基于“Hello,Views”中的网格视图示例): 布局是这样的: 谢谢你的帮助。 下面是GridView的一个截图(现在,所有的条目都有相同的图片)。我想在选中的图像周围画一个某种颜色的框,但是我得到一个橙色的矩形,一

  • 问题内容: 此代码不适用于MySQL 5.0,如何重写使其正常工作 我想删除没有唯一ID的列。我会在大多数情况下添加唯一的一个ID(我尝试了in语法,它也不起作用)。 问题答案: (子)查询返回结果 集 。因此,您需要使用,而不是在子句中使用。 此外,如该答案所示,您不能在同一查询中的子查询中修改同一表。但是,您可以然后在单独的查询中进行嵌套,也可以嵌套另一个子查询并为内部子查询结果添加别名(尽管

  • 我正在努力让这个程序完全按照作业的要求去做。当试图删除一个添加的学生时,它抛出一个空指针异常。另外,当我列出学生时,它显示所有内容都是空的。 -代码是固定的- 学生班: 包分配; 公开课学生{ 公共字符串 getFirstName() }