今天在使用ViewPager的時候發(fā)現(xiàn)個問題。
需求如下:
在ViewPager底下放入6個Fragment,每次移動ViewPager的時候更新里面的數(shù)據(jù)。
需求很簡單。
我把每次刷新事件放入Fragment初始化中,發(fā)現(xiàn)ViewPager有個預(yù)緩存功能,至少會加載周邊的一個Fragment。當滑動到周邊的時候,會發(fā)現(xiàn)Fragment中數(shù)據(jù)沒有變化。
我看了下Viewpager源碼,v4包下的Viewpager至少加載周邊一個Fragment,此值無法修改。
如繼承Viewpager創(chuàng)建新控件,發(fā)現(xiàn)還是無法修改DEFAULT_OFFSCREEN_PAGES的作用。
如重新實現(xiàn)Viewpager類,發(fā)現(xiàn)有部分v4包下的內(nèi)部類無法獲取。不過網(wǎng)上有博客實現(xiàn)了viewPager的功能的新類。
不過問題又來了,我上邊有個標題欄,實現(xiàn)滑動效果,使用的控件為android.support.design.widget.TabLayout 。此控件綁定Viewpager。方法為setupWithViewPager(viewPager)。發(fā)現(xiàn)自己寫的viewpager無法作為此參數(shù)。
如果每次在Fragment初始化時加載數(shù)據(jù),同時又在Veiwpager的change事件中再加載,會發(fā)現(xiàn)加載2次數(shù)據(jù),與需求不符。
為了解決加載兩次的這個問題,無意發(fā)現(xiàn)一個解決方案。
每個Fragement有各自的一個Tag,我通過此值來分辨不同的Fragment。
在Fragment初始化時,做判斷,只當Fragment為第一個時,加載數(shù)據(jù)。代碼如下:
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(Fragment.TYPE_ONE.equals(fileType)) {
loadInfo(fileType);
}
}
然后在Viewpager界面預(yù)加載所有Fragment。代碼如下:
viewPager.setOffscreenPageLimit(fragmentList.size());
通過實現(xiàn)viewpager的滑動改變來重新加載數(shù)據(jù):
viewPager.addOnPageChangeListener(this);
@Override
public void onPageSelected(int position) {
loadInfo(fileType);
}
測試發(fā)現(xiàn)當展現(xiàn)其中的一個Fragment的時候,保證加載一次數(shù)據(jù)。