今天在使用ViewPager的时候发现个问题。
需求如下:
在ViewPager底下放入6个Fragment,每次移动ViewPager的时候更新里面的数据。
需求很简单。
我把每次刷新事件放入Fragment初始化中,发现ViewPager有个预缓存功能,至少会加载周边的一个Fragment。当滑动到周边的时候,会发现Fragment中数据没有变化。
我看了下Viewpager源码,v4包下的Viewpager至少加载周边一个Fragment,此值无法修改。
如继承Viewpager创建新控件,发现还是无法修改DEFAULT_OFFSCREEN_PAGES的作用。
如重新实现Viewpager类,发现有部分v4包下的内部类无法获取。不过网上有博客实现了viewPager的功能的新类。
不过问题又来了,我上边有个标题栏,实现滑动效果,使用的控件为android.support.design.widget.TabLayout 。此控件绑定Viewpager。方法为setupWithViewPager(viewPager)。发现自己写的viewpager无法作为此参数。
如果每次在Fragment初始化时加载数据,同时又在Veiwpager的change事件中再加载,会发现加载2次数据,与需求不符。
为了解决加载两次的这个问题,无意发现一个解决方案。
每个Fragement有各自的一个Tag,我通过此值来分辨不同的Fragment。
在Fragment初始化时,做判断,只当Fragment为第一个时,加载数据。代码如下:
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(Fragment.TYPE_ONE.equals(fileType)) {
loadInfo(fileType);
}
}
然后在Viewpager界面预加载所有Fragment。代码如下:
viewPager.setOffscreenPageLimit(fragmentList.size());
通过实现viewpager的滑动改变来重新加载数据:
viewPager.addOnPageChangeListener(this);
@Override
public void onPageSelected(int position) {
loadInfo(fileType);
}
测试发现当展现其中的一个Fragment的时候,保证加载一次数据。