首先來看看對比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)