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.当你想要的时候,你可以添加另一个页面。 在我的情况下,当我需要用户在处理当前页面之前生成另一个。 他这样做,然后,没有问题可以刷到下一页。
希望它能帮助别人。