1. 程式人生 > >安卓開發 RecycleView 中notifyItemRemoved遇到的那些坑, IndexOutOfIndexException、刪除錯亂,陣列越界等終極解決方案,多人親測可行

安卓開發 RecycleView 中notifyItemRemoved遇到的那些坑, IndexOutOfIndexException、刪除錯亂,陣列越界等終極解決方案,多人親測可行

當我們在開發過程中要刪除RecycleView中的某個item時,都喜歡notifyItemRemoved方法帶來的動畫效果,然而,會遇到錯亂的坑,主要有三個,如下:

  1. 再刪除後面的item,會發生錯亂
  2. 再繼續刪,刪到後面就會崩掉,陣列越界
  3. 加上 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(); } } }); }