安卓開發 RecycleView 中notifyItemRemoved遇到的那些坑, IndexOutOfIndexException、刪除錯亂,陣列越界等終極解決方案,多人親測可行
阿新 • • 發佈:2019-02-14
當我們在開發過程中要刪除RecycleView中的某個item時,都喜歡notifyItemRemoved方法帶來的動畫效果,然而,會遇到錯亂的坑,主要有三個,如下:
- 再刪除後面的item,會發生錯亂
- 再繼續刪,刪到後面就會崩掉,陣列越界
- 加上 notifyItemRangeChanged以後,如果快速刪除,還是會有問題,因為這個方法裡面開了多執行緒,而沒有給出介面。
下面我給到終極解決辦法,就比網上其他大神的多幾行程式碼,其實主要問題是notifyItemRangeChanged開啟了多執行緒,我們再開啟個執行緒,設定一個boolean的變數,控制boolean變數的值就好了
@Override
public void onBindViewHolder(final CommonViewHolder holder, final int position) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isDeleteAble) {//此時為增加動畫效果,重新整理部分資料來源,防止刪除錯亂
isDeleteAble = false;//初始值為true,當點選刪除按鈕以後,休息0.5秒鐘再讓他為
//true,起到讓資料來源重新整理完成的作用
contentList.remove(position);//刪除資料來源
notifyItemRemoved(position);//重新整理被刪除的地方
notifyItemRangeChanged(position, getItemCount()); //重新整理被刪除資料,以及其後面的資料
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(500);//休息
}
isDeleteAble = true;//可點選按鈕
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
});
}