2013-02-08 163 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

相關問題