RecyclerView中notifyDataSetChanged刷新總結

除了adapter.notifyDataSetChanged()這個方法以外,新的Adapter還提供了其餘的方法,以下:api

public final void notifyDataSetChanged()
public final void notifyItemChanged(int position)
public final void notifyItemRangeChanged(int positionStart, int itemCount)
public final void notifyItemInserted(int position)
public final void notifyItemMoved(int fromPosition, int toPosition)
public final void notifyItemRangeInserted(int positionStart, int itemCount)
public final void notifyItemRemoved(int position)
public final void notifyItemRangeRemoved(int positionStart, int itemCount)

基本上看到方法的名字就知道這個方法是幹嗎的了,動畫

第一個方法沒什麼好講的,跟之前同樣。spa

notifyItemChanged(int position),position數據發生了改變,那調用這個方法,就會回調對應position的onBindViewHolder()方法了,固然,由於ViewHolder是複用的,因此若是position在當前屏幕之外,也就不會回調了,由於沒有意義,下次position滾動會當前屏幕之內的時候一樣會調用onBindViewHolder()方法刷新數據了。其餘的方法也是一樣的道理。code

public final void notifyItemRangeChanged(int positionStart, int itemCount),顧名思義,能夠刷新從positionStart開始itemCount數量的item了(這裏的刷新指回調onBindViewHolder()方法)。blog

public final void notifyItemInserted(int position),這個方法是在第position位置被插入了一條數據的時候可使用這個方法刷新,注意這個方法調用後會有插入的動畫,這個動畫可使用默認的,也能夠本身定義。rem

public final void notifyItemMoved(int fromPosition, int toPosition),這個方法是從fromPosition移動到toPosition爲止的時候可使用這個方法刷新get

public final void notifyItemRangeInserted(int positionStart, int itemCount),顯然是批量添加。it

public final void notifyItemRemoved(int position),第position個被刪除的時候刷新,一樣會有動畫。io

public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量刪除。class

 

這些方法分析完以後,咱們來實現一個點擊一個按鈕,新增一條數據,長按一個item,刪除一條數據的場景。

如下是新增一條數據的代碼:

Person person = new Person(i, "WangJie_" + i, 10 + i);
adapter.notifyItemInserted(2);
personList.add(2, person);
adapter.notifyItemRangeChanged(2, adapter.getItemCount());

如上代碼:

Line2:表示在position爲2的位置,插入一條數據,這個時候動畫開始執行。

Line3: 表示在數據源中position爲2的位置新增一條數據(其實這個纔是真正的新增數據啦)。

Line4: 爲何要刷新position爲2之後的數據呢?由於,在position爲2的位置插入了一條數據後,新數據的position變成了2,那原來的position爲2的應該變成了3,3的應該變成了4,因此2之後的全部數據的position都發生了改變,因此須要把position2之後的數據都要刷新。理論上是這樣,可是實際上刷新的數量只有在屏幕上顯示的position爲2之後的數據而已。若是這裏使用notifyDataSetChanged()來刷新屏幕上顯示的全部item能夠嗎?結果不會出錯,可是會有一個問題,前面調用了notifyItemInserted()方法後會在執行動畫,若是你調用notifyDataSetChanged()刷新屏幕上顯示的全部item的話,必然也會刷新當前正在執行動畫的那個item,這樣致使的結果是,前面的動畫還沒執行完,它立刻又被刷新了,動畫就看不見了。因此只要刷新2之後的item就能夠了。

 

看了RecyclerView的api,發現沒有setOnItemClickListener--,因此仍是本身把onItemClick從Adapter中回調出來吧。這個很簡單,就像上面PersonAdaper中寫的OnRecyclerViewListener那樣。

 

長按刪除的代碼以下:

adapter.notifyItemRemoved(position);
personList.remove(position);
adapter.notifyItemRangeChanged(position, adapter.getItemCount());

代碼跟以前插入的代碼基本一致。先通知執行動畫,而後刪除數據源中的數據,而後通知position以後的數據刷新就能夠了。

相關文章
相關標籤/搜索