2011-04-01 52 views
0

我有一個simple_list_item_multiple_choice listview在我的佈局,我想從中刪除所有選定的項目。我知道如何刪除它,但我有在刪除項目的兩個主要問題: -在Android中刪除ListView中的項目時遇到IndexOutOfBoundException?

  1. 我的程序是不是刪除2名以上的項目一樣,如果我選擇了4個項目則只有2個將被刪除,有時它甚至刪除了錯誤的項目。

  2. 當我調試我的代碼,我發現陣列IndexOutOfBoundException在我的代碼和據我知道有這樣也不例外在我的代碼和它刪錯了以下項目的所有感覺。

這裏是我的代碼: -

public void onClick(View view) 
{ 
    SparseBooleanArray checkedPositions = new SparseBooleanArray(); 
    checkedPositions.clear(); 
    checkedPositions = lv.getCheckedItemPositions(); 
    int size = checkedPositions.size(); 
    if(size != 0) 
    { 
     try 
     { 
     for(int i = 0; i < size; i++) 
     { 
      if(checkedPositions.valueAt(i)) 
      { 
       list.remove(checkedPositions.keyAt(i)); 
       notes.notifyDataSetChanged(); 
       lv.setItemChecked(i,false); 
      } 
     }}catch (IndexOutOfBoundsException ie) 
     {} 
    } 
     else{} 
} 

我捕捉到的異常僅用於調試的目的。提前致謝,但請幫助,因爲我從最後兩天卡住了這部分。

+0

應該是I <大小我想 – m0s 2011-04-01 07:15:47

+0

@ M0S我想,也是,我甚至試圖I = 1,大小+ 1,-1大小或每一個可能的變化可能被製成循環。還是行不通。例外仍然存在。 :( – Varundroid 2011-04-01 07:18:17

+0

你應該檢查是什麼導致異常,list.remove(...)或checkedPositions.valueAt(...)。它不是很清楚什麼是列表和如何初始化 – m0s 2011-04-01 07:24:25

回答

1
for(int i = size-1 ; i >= 0; i--) 
{ 
    if(checkedPositions.valueAt(i)) 
    { 
    list.remove(checkedPositions.keyAt(i)); 
    //lv.setItemChecked(checkedPositions.keyAt(i),false); 
    } 
} 
notes.notifyDataSetChanged(); 
+0

我覺得有時候你拋出IndexOutOfBoundsException與checkedPositions.keyAt(我)調用發生在[如果你初始化你的循環錯誤]有時它與list.remove(#等等#)調用[如果你刪除了一些內容已],其這使得調試變得困惑。 – kharles 2011-04-01 09:13:59

+0

如果這仍然不起作用嘗試做這樣的事情: INT TEMP = checkedPositions.keyAt(我); list.remove(temp); ,以便您可以調試哪個部分正在消除。 – kharles 2011-04-01 09:15:36

+0

@Kharles man你的解決方案像魅力一樣工作,但當我試圖一次刪除所有的項目,它再次開始給我IOOBException。 – Varundroid 2011-04-01 09:25:28

1

從它的外觀,則應該改變這種

for(int i = 0; i <= size; i++) 

for(int i = 0; i < size; i++) 
+0

Sted我試過了,還是不行。 ( – Varundroid 2011-04-01 07:20:05

+0

)哪一行正在給你IndexOutOfBoundException?它是否發生在list.remove(checkedPositions.keyAt(i))? – SteD 2011-04-01 07:23:15

+0

是的SteD我在這一行中有錯誤,因爲keyAt()返回size() - 1索引,這可能是我的代碼中的問題,但我不知道如何刪除此錯誤。任何解決方案 – Varundroid 2011-04-01 07:41:07

3

每次從在下部杆陣列中刪除項目,總計數被減少了1.如果你有4件物品要移除[0,1,2,3],並且你移除了從物品0開始的物品,你有[0,1,2],那麼你從1移除物品,並且你有[0 ,1],如果您嘗試刪除索引2中不存在的項目,則會收到錯誤消息。嘗試倒計時,而不是像這樣

for(int i = size; i > 0; --i) 
{ 
    if(checkedPositions.valueAt(i)) 
    { 
    list.remove(checkedPositions.keyAt(i)); 
    notes.notifyDataSetChanged(); 
    lv.setItemChecked(i,false); 
    } 
} 
+0

好,因爲你建議我嘗試過,但當我試圖刪除三個項目,它只是刪除兩個,當我試圖刪除四個項目,然後再次遇到IOOBException,並不得不強制關閉我的應用程序。 :( – Varundroid 2011-04-01 07:46:09

+0

嘗試註釋掉這一行,看看它是否導致錯誤 //lv.setItemChecked(i,false); – bdhac 2011-04-01 07:54:42

+0

嘗試它仍然得到這個 java.lang。IndexOutOfBoundsException異常:無效的指數11,大小爲11 – Varundroid 2011-04-01 08:00:10