Viewpager在調用notifyDataSetChanged()時,界面無重新整理,它确實影響我們功能的實作了。可能選擇為Viewpager重新設定一遍擴充卡adapter,達到重新整理的目的。但是這種方法在大多數情況下,是有問題的。
super.notifyDataSetChanged()調用的是PagerAdapter.notifyDataSetChanged()
注釋裡說到,當附加在擴充卡上的資料發生變化時,應該調用該方法重新整理資料。該方法調用了一個mObservable .notifyChanged();
我們繼續跟進這個方法,進入DataSetObservable類中,發現這樣一段代碼:
這都不是重點,重點我們來看這個mObservers的類型是一個抽象類DataSetObserver,裡面隻有兩個未實作的方法,都有誰使用了這個抽象類呢,其中我們發現了Viewpager的身影。進入viewpager,我們終于找到了viewpager中控制資料變更的重點方法dataSetChanged ,這個方法如下:
重點看這樣一行代碼:
意思是如果item的位置如果沒有發生變化,則傳回POSITION_UNCHANGED。如果傳回了POSITION_NONE,表示該位置的item已經不存在了。預設的實作是假設item的位置永遠不會發生變化,而傳回POSITION_UNCHANGED
是以我們可以嘗試着修改擴充卡的寫法,覆寫getItemPosition()方法,當調用notifyDataSetChanged時,讓getItemPosition方法人為的傳回POSITION_NONE,進而達到強迫viewpager重繪所有item的目的。