RecyclerView加載更多用notifyDataSetChanged()刷新圖片閃爍


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

  • notifyItemChanged(int position) 更新列表position位置上的數據可以調用
  • notifyItemInserted(int position) 列表position位置添加一條數據時可以調用,伴有動畫效果
  • notifyItemRemoved(int position) 列表position位置移除一條數據時調用,伴有動畫效果
  • notifyItemMoved(int fromPosition, int toPosition) 列表fromPosition位置的數據移到toPosition位置時調用,伴有動畫效果
  • notifyItemRangeChanged(int positionStart, int itemCount) 列表從positionStart位置到itemCount數量的列表項進行數據刷新
  • notifyItemRangeInserted(int positionStart, int itemCount) 列表從positionStart位置到itemCount數量的列表項批量添加數據時調用,伴有動畫效果
  • 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()); //進行列表全部刷新 

  很完美的解決了。

 

參考:1.RecyclerView實現瀑布流遇到的各種問題(item移動,加載更多圖片閃爍,以及定制各種類型Header和Footer)

   2.RecyclerView之更新UI數據的高級用法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM