2013-02-08 141 views
0

我有列表视图,其中包含textview和按钮。当我删除列表视图项的,我尝试向下滚动,我得到这个异常:从列表视图中删除项目

BuildQueue eile = countryList.get(position); 

例外:

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

看来我不更新的东西时,我从列表视图中删除的项目。我认为我有问题,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()'? – 2013-02-08 18:08:35

+0

yes,dataAdapter.notifyDataSetChanged(); – sider 2013-02-08 18:09:40

回答

2

您正在使用您的适配器将两个数组,但只改变其中的一个。

每个适配器使用getCount()来确定应绘制多少行。 ArrayAdapter的getCount()只需要传递给超级构造函数的数组的大小:super(context, textViewResourceId, countryList);。但你也使用第二,本地阵列,当你删除这个countryListgetCount()值已经不知道发生这种情况导致getView()抛出IndexOutOfBoundsException异常...

可以扩展BaseAdapter,或使用ArrrayAdapter的方法,如getItem()add()remove()并删除您的本地数据集。

+0

我添加了: dataAdapter.remove(building); 现在它的作品,谢谢:) – sider 2013-02-08 18:17:00

+0

很高兴我能帮上忙。 (如果您还没有这样做,我强烈建议删除'countryList'的本地副本以防止出现类似此类错误。) – Sam 2013-02-08 18:19:57