Получение IndexOutOfBoundsException при удалении элемента из Java ArrayList - PullRequest
1 голос
/ 30 августа 2011

У меня есть список значений.Я хочу удалить элемент списка, когда флажок снят:

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 выбран. Значения флажка

   selectedRoutes   
   [R0002]

routeList отображает список маршрутов наэкран.Извлекает маршрут из базы данных.

Пример routeList:

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

, вызывающий remove from selectedRoutes (1).

   selectedRoutes.remove(arg0.getId());

Здесь selectedRoutes содержит только одну запись,что означает отсутствие индекса 1.

Как я могу удалить это?

Ответы [ 4 ]

4 голосов
/ 30 августа 2011

Проблема в следующем разделе кода:

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 голос
/ 30 августа 2011

Было бы намного проще, если бы вы создали selectedRoutes , чтобы быть коллекцией тех же самых объектов ArrayList<SalesRoutes> selectedRoutes.Поскольку обе коллекции будут содержать ссылки на один и тот же объект, вы можете удалить объект по его ссылке:

salectedRoutes.remove(routeList.get(arg0.getId()));
0 голосов
/ 30 августа 2011

Вы смешали ArrayList.remove(int index) и ArrayList.remove(Object o).

0 голосов
/ 30 августа 2011

Вызов ArrayList.remove (int location) удалит объект в этом месте массива. не удаляет объект по значению его идентификатора.

Похоже, вы добавляете объект в массив списков в позиции индекса, возвращаемой .getRouteCode ()

Но затем вы пытаетесь удалить объект в позиции индекса, возвращаемой .getId ().

Два не синхронизируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...