故事背景是這樣的:項目做的是個類似抖音的短視頻播放功能,點擊進去視頻詳情,全屏播放,然後上下滑動切換視頻,用的是RecyclerView結合阿里雲player做的視頻流播放,因爲這個後臺是個分頁接口,所以在上滑到快沒數據的時候需要加載更多。之前用的是:
this.list.clear(); //清空數據源
this.list.addAll(list); //更新數據源
adapter.notifyDataSetChanged();//刷新列表
然後就有個小問題,每頁請求10條,如果首頁當前總共10個視頻,從首頁直接點擊第10個,即當前是正在播放第10個視頻,然後直接就請求下一頁視頻數據了,使用上面的代碼會導致當前正在播放的視頻重新開始播放,體驗不太好,而且衆所周知notifyDataSetChanged()全部刷新,效率是最低的。就想着使用RecyclerView的局部刷新來替換解決,即
notifyItemRangeChanged(this.list.size()-list.size(),this.list.size()); //只刷新加載多出來的部分數據列表
然後運行發現沒效果,多的數據上滑沒有出現!懵逼ing。。。 (tip:之前一般都是用RecyclerView做列表,第一次做這種複雜的視頻流~)
//最後換成了這種寫法,順利刷新數據,同時不中斷當前正在播放的視頻進度:
this.list.addAll(list);//更新數據源 notifyItemRangeInserted(this.list.size()-list.size(),this.list.size());//更新列表個數 notifyItemRangeChanged(this.list.size()-list.size(),this.list.size());//更新列表數據
顧名思義,先插入列表個數,再進行局部刷新操作,記錄一下,具體什麼原因還沒來得及看源碼,先這樣解決了,over。