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()刷新圖片閃爍windows

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

解決方法:測試

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

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

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

 

我在項目中使用了:對象

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

  改進方法:圖片

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

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

  很完美的解決了。

 

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

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

相關文章
相關標籤/搜索