2013-02-08 3 views
0

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

BuildQueue eile = countryList.get(position); 

Исключение:

02-08 19:11:04.279: E/AndroidRuntime(10509): java.lang.IndexOutOfBoundsException: Invalid index 15, size is 15 

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

Мой ArrayAdapter код:

public class MyCustomAdapter extends ArrayAdapter<BuildQueue> { 

     private ArrayList<BuildQueue> countryList; 

     public MyCustomAdapter(Context context, int textViewResourceId,ArrayList<BuildQueue> countryList) { 
      super(context, textViewResourceId, countryList); 
      this.countryList = new ArrayList<BuildQueue>(); 
      this.countryList.addAll(countryList); 
     } 

     private class ViewHolder { 
      TextView code; 
      TextView field; 
      Button del; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      ViewHolder holder = null; 

      if (convertView == null) { 
       LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = vi.inflate(R.layout.queue_buildings, null); 

       holder = new ViewHolder(); 
       holder.code = (TextView) convertView.findViewById(R.id.code); 
       holder.field = (TextView) convertView.findViewById(R.id.field_text); 
       holder.del = (Button) convertView.findViewById(R.id.del_button); 
       convertView.setTag(holder); 

       holder.del.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
         Button del_button = (Button) v; 
         BuildQueue building = (BuildQueue) del_button.getTag(); 
         countryList.remove(building); 
         dataAdapter.notifyDataSetChanged(); 
        } 
       }); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      BuildQueue eile = countryList.get(position); 
      holder.code.setText(" (Level: " + eile.getOld_level() + " to "+eile.getNew_level()+")"); 

      holder.field.setText(eile.getNameSort()); 
      holder.field.setTag(eile); 

      holder.del.setText("Delete"); 
      holder.del.setTag(eile); 

      return convertView; 

     } 
    } 
+0

Вы используете 'notifyDataSetChanged()'? –

+0

yes, dataAdapter.notifyDataSetChanged(); – sider

ответ

2

Вы используете два массива в вашем адаптере, но только изменение одного из них ,

Каждый адаптер использует getCount(), чтобы определить, сколько строк должно быть нарисовано. ArrayAdapter getCount() просто запрашивает размер массива, который вы передаете супер конструктору здесь: super(context, textViewResourceId, countryList);. Но вы также используете второй, локальный массив и при удалении значения из этого countryListgetCount() имеет ни малейшего представления, это произошло в результате чего getView() выбрасывания IndexOutOfBoundsException ...

Либо продлить BaseAdapter, или использовать методы ArrrayAdapter как getItem(), add() и remove() и удалите локальный набор данных.

+0

Я добавил: dataAdapter.remove (building); сейчас он работает, спасибо :) – sider

+0

Рад, что я мог помочь. (Если вы этого еще не сделали, я настоятельно рекомендую удалить локальную копию 'countryList', чтобы предотвратить будущие ошибки, подобные этому.) – Sam

Смежные вопросы