2011-11-06 55 views
1

我創建了一個具有複選框的自定義ListView。我想刪除「刪除」菜單選項選擇中的選定項目。 我正在處理CheckBox上的onCheckedChanged事件。在這裏我維護一個ArrayList來記下所選元素的位置。現在,當用戶選擇「刪除」菜單項時,我會從ListAdapter的ArrayList中刪除選擇的項目。錯誤的列表項被刪除,而不是使用自定義列表適配器選擇的項目

下面是我的代碼,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    names = new ArrayList<String>(); 
    names.add("first"); 
    names.add("second"); 
    names.add("three"); 
    names.add("four"); 
    names.add("five"); 
    names.add("six"); 
    names.add("seven"); 
    names.add("eight"); 
    names.add("nine"); 

    listAdapter = new SelfAdapter(this,names); 

    this.setListAdapter(listAdapter);      
} 

    @Override 
public boolean onOptionsItemSelected(MenuItem menuItem){ 
    int menuId = menuItem.getItemId(); 
    ArrayList<Integer> selectedItems; 
    switch(menuId){ 
    case R.id.delitem: 
     Log.d(TAG,"del item selected"); 
     selectedItems = listAdapter.getSelected(); 
      **//pick the selected position items and delete them from the 
      // listadapter arraylist** 
     for(Integer element: selectedItems){ 
      Log.d(TAG,"Selected:"+element.toString()); 
      names.remove(element.intValue()); 
      listAdapter.notifyDataSetChanged(); 
     }   
    } 
    return true; 
} 

下面是自定義適配器的代碼,

}

現在的問題是,如果選擇第1,第2項(例如)然後我看到錯誤的項目被刪除,並在完全錯誤後填充listview。後來如果我試圖刪除它拋出的「索引越界異常」的項目。我猜getView方法中的代碼出錯了。

有人可以幫助我找出在這裏做錯了什麼。

感謝

+0

你能提供具體的問題嗎?選擇第一和第二項時,哪些項目會被刪除?之後listview有什麼用? –

+0

@Ted Hopp - 無論我選擇的項目被刪除的項目是完全不同的(沒有模式)...說如果我選擇第一和第二項目,然後刪除第八和第九項目..但這只是一個例子。 ..沒有一定的模式 – droidsites

回答

1

當您從names中刪除元素時,還需要從checkedPos陣列中刪除元素。否則,這兩個陣列將具有不同的長度。然後,當您再次嘗試時,checkedPos將比names更長,並且最終導致索引越界異常。

此外,當您從names刪除時,不能使用正常的迭代器。如果您應該刪除索引1和2中的名稱,那麼當您刪除名稱1時,名稱2會移動到位置1,但您的索引不會相應更新。最簡單的解決方案是向後遍歷位置數組,從names的末尾刪除,然後從頭開始刪除。

P.S.從序號(「第一」,「第二」)切換到列表中間的基數(「三」,「四」等)有些奇怪。

+0

謝謝。沒有完全解決我的問題,但它是非常大的提示,我得到了...... :-) – droidsites

+0

也許它會在刪除'names'中的元素後清除'checkedPos'數組。 –

+0

再次感謝。現在我只是先在位置上降序排列(因爲所選項目是隨機的),然後從「Data arrayList」中刪除每個元素,然後清除。修復了我完整的問題:-) – droidsites

0

必須刪除 名稱=新的ArrayList < STRING>();

但您刪除selectedItems;

相關問題