2011-08-30 70 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()));