`
l540151663
  • 浏览: 181358 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

解决ViewPager的addOnPageChangeListener不加载第一个的问题

 
阅读更多
今天在使用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的时候,保证加载一次数据。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics