ViewPager.setOffscreenPageLimit(0)不能按预期方式工作

我在ViewPager实例中使用的片段资源密集,所以我只想一次加载一个。 当我尝试以下:

 mViewPager.setOffscreenPageLimit(0); mViewPager.setAdapter(mPagerAdapter); 

我的FragmentStatePagerAdapter.getItem(int position)覆盖函数被调用3次,这是我调用mViewPager.setOffscreenPageLimit(1)时发生的事情。 我希望它只能被调用一次,因为我指定了0离屏页面。

我相信我正确调用一切,因为如果我调用mViewPager.setOffscreenPageLimit(2)FragmentStatePagerAdapter.getItem(int position)被调用5次,我所期望的。

ViewPager是否需要至less1个屏幕外的页面,或者我在这里做错了什么?

ViewPager是否需要至less1个屏幕外的页面

是。 如果我正确地阅读源代码,你应该在LogCat中得到这个警告,例如:

 Requested offscreen page limit 0 too small; defaulting to 1 

我发现的最好的方法是setUserVisibleHint
将此添加到您的片段

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // load data here }else{ // fragment is no longer visible } } 

首先添加

  boolean _areLecturesLoaded = false; 

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser && !_areLecturesLoaded) { //Load Your Data Here like.... new GetContacts().execute(); _areLecturesLoaded = true; } else{ } } 

你可以这样尝试:

 public abstract class LazyFragment extends Fragment { protected boolean isVisible; /** * 在这里实现Fragment数据的缓加载. * @param isVisibleToUser */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(getUserVisibleHint()) { isVisible = true; onVisible(); } else { isVisible = false; onInvisible(); } } protected void onVisible(){ lazyLoad(); } protected abstract void lazyLoad(); protected void onInvisible(){} 

ViewPager默认加载下一页(Fragment),你不能通过setOffscreenPageLimit(0)来改变。 但是你可以做点什么来破解。 您可以在包含ViewPager的Activity中实现onPageSelected函数。 在下一个Fragment(你不想加载)中,你写了一个函数让我们说showViewContent(),你放入所有耗费资源的init代码,并且在onResume()方法之前什么也不做。 然后在onPageSelected中调用showViewContent()函数。 希望这会有所帮助。

对于“instantiateItem”函数,只需准备片段,但不要加载重量级的内容。

使用“onPageChangeListener”,这样每次你到一个特定的页面,你加载它的沉重的内容,并显示它。

这可能是旧线程,但这似乎为我工作。 覆盖此function:

 @Override public void setMenuVisibility(boolean menuVisible) { super.setMenuVisibility(menuVisible); if ( menuVisible ) { /** * Load your stuffs here. */ } else { /** * Fragment not currently Visible. */ } } 

快乐的编码…

我有类似的问题。 我在这个网站上find了一些有用的代码并进行了转换。

min int for mViewPager.setOffscreenPageLimit(…); 是1,所以即使您将其更改为0,您仍将加载2个页面。

首先要做的是创build一个静态的我们将调用maxPageCount并重写FragmentStatePagerAdapter方法getCount()来返回maxPageCount:

  @Override public int getCount() { return maxPageCount; } 

然后创build一个静态方法,可以从程序中的任何地方访问,这将允许你改变这个maxCount:

 public static void addPage(){ maxPageCount++; //or maxPageCount = fragmentPosition+2 mFragmentStatePagerAdapter.notifyDataSetChanged(); //notifyDataSetChanged is important here. } 

现在将maxPageCount初始化为1.当你想要的时候,你可以添加另一个页面。 在我的情况下,当我需要用户在处理当前页面之前生成另一个。 他这样做,然后,没有问题可以刷到下一页。

希望它能帮助别人。