Обнаружена исключительная ситуация IndexOutOfBoundException при удалении элементов из ListView в Android? - PullRequest
0 голосов
/ 01 апреля 2011

У меня есть один simple_list_item_multiple_choice просмотр списка в моем макете, и я пытаюсь удалить из него все выбранные элементы.Я знаю, как удалить его, но у меня возникают две серьезные проблемы при удалении элементов: -

  1. Моя программа не удаляет более 2 элементов, например, если я выбрал 4 элемента, то только 2будет удален, а иногда даже удаляет неправильные элементы.

  2. Когда я отлаживал свой код, я обнаружил Array IndexOutOfBoundException в моем коде и насколько я знаю, естьв моем коде нет исключений, подобных этому, и все из-за удаления неправильных или меньших элементов.

вот мой код: -

public void onClick(View view)
{
    SparseBooleanArray checkedPositions = new SparseBooleanArray();
    checkedPositions.clear();
    checkedPositions = lv.getCheckedItemPositions();
    int size = checkedPositions.size();
    if(size != 0)
    {
        try
        {
        for(int i = 0; i < size; i++)
        {
            if(checkedPositions.valueAt(i))
            {
                list.remove(checkedPositions.keyAt(i));
                notes.notifyDataSetChanged();
                lv.setItemChecked(i,false);
            }
        }}catch (IndexOutOfBoundsException ie)
        {}
    }
        else{}
}

Я поймал исключениетолько для отладки.Заранее спасибо, но, пожалуйста, помогите, потому что я застрял в этой части с последних двух дней.

Ответы [ 3 ]

3 голосов
/ 01 апреля 2011

Каждый раз, когда вы удаляете элемент из массива на нижнем рычаге, общее количество уменьшается на 1. Если у вас было 4 элемента для удаления [0, 1, 2, 3], и вы удаляете элементы, начинающиеся с элемента0, у вас есть [0, 1, 2], затем вы удаляете элемент в 1, и у вас есть [0, 1], если вы попытаетесь удалить элемент в индексе 2, который не существует, вы получите ошибку.Попробуйте отсчитать, а не как

for(int i = size; i > 0; --i)
{
  if(checkedPositions.valueAt(i))
  {
    list.remove(checkedPositions.keyAt(i));
    notes.notifyDataSetChanged();
    lv.setItemChecked(i,false);
  }
}
1 голос
/ 01 апреля 2011
for(int i = size-1 ; i >= 0; i--) 
{
  if(checkedPositions.valueAt(i))
  {
    list.remove(checkedPositions.keyAt(i));
    //lv.setItemChecked(checkedPositions.keyAt(i),false);
  }
}
notes.notifyDataSetChanged();
1 голос
/ 01 апреля 2011

Судя по всему, вы должны изменить это

for(int i = 0; i <= size; i++)

до

for(int i = 0; i < size; i++)
...