从Java ArrayList中删除项时接收IndexOutOfBoundsException

时间:2011-08-30 12:40:25

标签: java android arraylist

我有一个值列表。我想在取消选中复选框时删除列表项:

ArrayList<SalesRoutes> routeList = new ArrayList<SalesRoutes>();
ArrayList<String> selectedRoutes = new ArrayList<String>();
 routeList =getSalesRoute();
for (int i = 0; i < routeList.size(); i++) {
         CheckBox ch = new CheckBox(this);
   ch.setId(i);
   ch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                    if(arg0.isChecked()){   
                        Log.i("add", routeList.get(arg0.getId()).getRouteCode());
                        selectedRoutes.add(routeList.get(arg0.getId()).getRouteCode());
                        System.out.println("----add ----" + selectedRoutes);
                    }else {
                        selectedRoutes.remove(arg0.getId());
                        Log.i("remove", routeList.get(arg0.getId()).getRouteCode());
                        System.out.println("----remove ----" + selectedRoutes);
                    }
                }
            });
   }

这里我得到IndexOutOfBoundsException因为selectedRoutes被选中CheckBox值

   selectedRoutes   
   [R0002]

routeList显示屏幕上的路由列表。它从数据库中获取路由。

示例routeList:

  Route List
  R0001
  R0002   // selected this one ID is 1
  R0003

从selectedRoutes(1)调用remove。

   selectedRoutes.remove(arg0.getId());

这里selectedRoutes只包含一条记录,这意味着没有索引1。

如何删除此内容?

4 个答案:

答案 0 :(得分:4)

问题在于这部分代码:

selectedRoutes.remove(arg0.getId());
Log.i("remove", routeList.get(arg0.getId()).getRouteCode());
System.out.println("----remove ----" + selectedRoutes);

您正在考虑(通常是错误的)假设您的潜在路线列表中的路线索引与所选路线列表中路线的索引相同。相反,您将希望在该索引的潜在路由列表中获取路由的路由代码,然后遍历您选择的路由列表(实际上只是包含路由代码的字符串),并删除两者中的索引配对。代码看起来像这样:

String routeCode = routeList.get(arg0.getId()).getRouteCode();
index = -1;
for(int i = 0; i < selectedRoutes.size(); i++) {
    if(routeCode.equals(selectedRoutes.get(i)) {
        index = i;
            break;
    }
}
if(index > -1)
    selectedRoutes.remove(index);
Log.i("remove", routeCode);
System.out.println("----remove ----" + selectedRoutes);

答案 1 :(得分:1)

如果您将 selectedRoutes 创建为相同对象ArrayList<SalesRoutes> selectedRoutes的集合会更容易。由于两个集合都包含对同一对象的引用,因此可以通过引用删除该对象:

salectedRoutes.remove(routeList.get(arg0.getId()));

答案 2 :(得分:0)

调用ArrayList.remove(int location)将删除数组中该位置的对象。它通过它的Id值删除对象。

看来你在.getRouteCode()返回的索引位置向arraylist添加一个对象

但是你试图删除.getId()返回的索引位置的对象。

两者不同步。

答案 3 :(得分:0)

您混合了ArrayList.remove(int index)ArrayList.remove(Object o)