2013-02-26 5 views
1

У меня есть ListView с onListItemListener, у меня оно есть, если вы нажмете элемент ListView, он удалит его, но по какой-то причине, если я удалю последний элемент формы из списка, приложение сбой и дает мне эту ошибку (java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3)Ошибка при удалении последнего элемента из списка ViewView в Android

Кто-нибудь знает, что это значит?

Это мой код:

@Override 
     protected void onListItemClick(ListView l, View v, int pos, long id) { 
      super.onListItemClick(l, v, pos, id); 
      adapter.remove(adapter.getItem(pos)); 
      adapter.notifyDataSetChanged(); 
     } 
+0

Какую линию вы получаете ошибку? Вы не должны получать его внутри этой функции – codeMagic

+0

@codeMagic 40, который является «adapter.remove (adapter.getItem (pos)); –

ответ

1

Я считаю, что я понял это, все ответы, которые считают, что переменная pos одно число слишком высоко, казалось логичным, но я пытался их всех, и они не сделали Работа.

Кажется, что было не так, когда я удалял последний элемент из списка, он попытался бы обновить ListView, но в нем не было ничего, чтобы обновить, поэтому приложение будет разбиваться, я изменил мой код немного, и теперь он отлично работает! :) Я не понимаю, почему это работает, но это так!

Спасибо за ответы!

@Override 
    protected void onListItemClick(ListView l, View v, int pos, long id) { 
     super.onListItemClick(l, v, pos, id); 

     if (adapter.getCount() != adapter.getItemId(pos)) { 
      adapter.remove(adapter.getItem(pos)); 
      adapter.notifyDataSetChanged();  
     }   
} 
+0

бонус 1 балл за вашу попытку. рад видеть вас – kemdo

4

Я предположил, что вы прошли позы = 3 в качестве значения параметра. Поскольку размер списка 3, позиция последнего элемента должно быть 2.

* EDIT:

Помните, что начальный индекс в ListView и адаптер отличается. Элемент ListView ListView начинается с «1» в качестве первой позиции, адаптер (например, массив) начинается с индекса «0» в качестве первой позиции.

adapter.remove(adapter.getItem(pos-1)); 
+0

Размер списка динамический, вы можете добавить элементы в список. –

+1

Я должен был объяснить более четко, обновил ответ. =) –

+0

На самом деле, pos начинается с 0, поэтому, если я попытаюсь сделать (pos-1), он будет прикручен, когда я удалю первый элемент. Но я нашел обходное решение. –

0

Согласно documentation вы должны были, используя идентификатор в качестве значения для удаления элемента.

так:

adapter.remove(adapter.getItem(id)); 
0

Попробуйте следующее: Если есть 4 пункта в lsitview то Lat пункт будет индексом 3 и первым будет с индексом 0.

@Override 
     protected void onListItemClick(ListView l, View v, int pos, long id) { 
      super.onListItemClick(l, v, pos, id); 
      adapter.remove(adapter.getItem(pos-1)); 
      adapter.notifyDataSetChanged(); 
     }