2011-08-30 62 views
1

我有一个值列表。我想删除列表项时复选框未点击:从Java ArrayList中删除项目时收到IndexOutOfBoundsException

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)。

selectedRoutes.remove(arg0.getId()); 

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

如何删除这个?

+0

'arg0.getId()'在第一个示例中包含'0'而在第二个示例中包含'1'? –

+0

arg0.getId()将返回复选框ID.I有2个arraylist'selectedRoutes'和'routelist' – Piraba

+0

什么是完整的例外?行号,堆栈跟踪,错误消息,请张贴全部。 – Ishtar

回答

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); 
+0

Thanks.Its greate.Working罚款..我应该做的HashMap。在Android中我想设置ArrayList,这就是我选择这个的原因。 – Piraba

0

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

看样子你是在()

但你试图在()的返回.getId的索引位置删除对象通过.getRouteCode返回的索引位置添加一个对象到ArrayList。

两者不同步。

+0

No.'getRouteCode()'包含带有复选框的路由列表。我想为选定的复选框值创建另一个列表列表。 – Piraba

+0

说实话,我认为你需要阅读Javadoc的索引位置和对象从ArrayList中添加/删除对象。 – C0deAttack

0

你有混合ArrayList.remove(int index)ArrayList.remove(Object o)

+0

我正好把arraylist名称:我有两个arrayList.One用于显示路由另一个选定的路由(复选框选定的值) – Piraba

1

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

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