記一次處理 list 的 remove 方法遇到的問題

現在想來,這真是一個太簡單的問題了,之前卻一直被困擾其中,不知道 bug 在什麼地方......

我自學 android 不久,算是摸着石頭過河。這幾天,我一直在搞 ListView 的問題,卻不想被 存放數據源的 List 給攔住,並困惑了很久啊。我主要想做刪除 ListView 的某一項,ListView 的每一項都是我自定義的 map ,裏面有一個存放圖片的 ImageView 和一個存放文字的 TestView,ImageView 原先是隱藏的,是一個刪除的圖標。我的邏輯是,在點下刪除按鈕後,就將每一項的刪除圖標都顯示出來,然後可以點擊刪除圖標進行行的刪除,其實就是將存放數據源的 List 對應行的數據進行刪除,再執行 notifyDataSetChanged() 方法即可通知 ListView 進行更新即可。我刪除的邏輯是在點擊刪除圖標時,並沒有真的刪除,而只是將對應行隱藏並重新刷新 ListView,而在點擊確定按鈕後才真正刪除,在點擊取消時也可恢復原狀。開始的時候,我定義一個 flag 數組,裏面標記了要刪除的對應的行的位置,我想在點擊確定按鈕後,在一個循環裏面依次刪除標記的行數據。按說這個邏輯應該很合理啊,可是我刪除的時候在有些情況下就拋 List 越界的異常,比如 List 裏面有三條數據,我刪除其中一條兩條都沒問題,可是如果我同時刪除三條就會拋異常,我真是很鬱悶啊......後來突然明白了原因,其實就是類似下面的代碼出故障了:

for (int i = 0; i < selectedNum; i++) {
   list.remove(flag[i]);
}

假設list 的長度爲2,selectedNum爲2,意思就是我要同時刪除list的1全部數據,但我remove(0) 的時候,可以移除,而此時list的長度就不是2了,已經變成了1,所以再循環裏面remove(1),肯定越界拋異常啊......而這就是爲什麼刪其中幾條可以,刪除全部就拋異常的原因。

本來是個很簡單的問題,由於沒考慮到這些,一直沒發現bug,不過這個問題也讓我學到了另一種解決的方法,就是自己寫了一個保存列表和讀取列表的方法,每次在刪除之前先保存列表,相當於保存刪除之前的樣子,確定刪除之後再保存列表,取消刪除之後就讀取之前保存的列表,終於將問題順利解決。想想還是自己知道的太少了,技術太弱。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章