RecyclerView的刷新方法

感謝原作者! 一隻呆萌的萌呆
RecyclerView的刷新方法非常強大,不比以前僵硬的ListView的notify全部了.有必要熟練掌握、

 首先來看看對比ListView看一下RecyclerView的Adapter主要增加了哪些方法:

1.notifyItemChanged(int position) 更新列表position位置上的數據可以調用

2.notifyItemInserted(int position) 列表position位置添加一條數據時可以調用,伴有動畫效果

3.notifyItemRemoved(int position) 列表position位置移除一條數據時調用,伴有動畫效果

4.notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的數據移到toPosition位置時調用,伴有動畫效果

5.notifyItemRangeChanged(int positionStart, int itemCount) 列表從positionStart位置到itemCount數量的列表項進行數據刷新

6.notifyItemRangeInserted(int positionStart, int itemCount) 列表從positionStart位置到itemCount數量的列表項批量添加數據時調用,伴有動畫效果

7.notifyItemRangeRemoved(int positionStart, int itemCount) 列表從positionStart位置到itemCount數量的列表項批量刪除數據時調用,伴有動畫效果

問題:加載更多用notifyDataSetChanged()刷新圖片閃爍

原因:notifyDataSetChanged()會導致整個itemview刷新,已經測試:相同position刷新其itemview是不同的對象,例如,刷新後,position爲12的用了position爲13的itemview,再次刷新時,又用了position爲10的itemview,這樣次position上對應的itemview的ImageView就會在重設size時發生閃爍,此現象是可以用肉眼看到的。

解決方法:

用notifyItemRangeInserted()進行增加數據使用的局部刷新,這樣原先的itemview就不會重繪

或者用notifyItemRangeChanged() 進行單純的局部刷新

注意:雖然方法是用來局部刷新的,但我們可以把局部刷新變成全部刷新,itemCount設成list.size()就可以實現不閃爍的全部刷新了,但最好加上這一句((SimpleItemAnimator)imagesListView.getItemAnimator()).setSupportsChangeAnimations(false);取消RecyclerView的動畫效果,不然刷新的話的確不會快閃但會有個動畫效果,體驗也是不怎麼好的。

我在項目中使用了:

  項目場景: 加載網絡圖片 進行點擊刷新 調用時習慣性調用notifyDataSetChanged() 然後出現閃爍情況,圖片越多閃爍越嚴重.

  改進方法:

  1.先調用((SimpleItemAnimator)imagesListView.getItemAnimator()).setSupportsChangeAnimations(false); //取消RecyclerView的動畫效果

  2.刷新列表使用了mAdapter.notifyItemRangeChanged(0,imageList.size()); //進行列表全部刷新

  很完美的解決了。

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