ViewPager.setOffscreenPageLimit(0)没有任何效果。我如何在ViewPager中一次只加载一页?
ViewPager.setOffscreenPageLimit(0)没有任何效果。我如何在ViewPager中一次只加载一页?
即使我设置了oViewPager.setOffscreenPageLimit(0),我的视图分页器仍然在可见页面的两侧每一侧加载1个离屏页面。
如何使它只在用户滑动到该页面时加载?
如果需要,这是我的适配器:
public class MainPagerAdapter extends FragmentPagerAdapter { protected static final String[] CONTENT = new String[] { "页面1", "页面2", "页面3", "页面4" }; private int mCount = CONTENT.length; public MainPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { //return TestFragment.newInstance(CONTENT[position % CONTENT.length]); return MainFragment.newInstance(position); } @Override public int getCount() { return mCount; } @Override public CharSequence getPageTitle(int position) { return MainPagerAdapter.CONTENT[position % CONTENT.length]; } public void setCount(int count) { if (count > 0 && count <= 10) { mCount = count; notifyDataSetChanged(); } } }
问题的原因是ViewPager的setOffscreenPageLimit(0)方法没有效果。这个方法用于设置ViewPager在滑动时预加载的页面数量,参数传入0表示只加载当前显示的页面。然而,由于ViewPager的设计,它至少会预加载一个页面,以保证滑动动画的流畅性。
解决方法是自定义ViewPager。通过自定义ViewPager,我们可以重写其预加载页面的逻辑,实现只在用户滑动到某个页面时才加载该页面的功能。这样就能避免在滑动过程中出现冻结或空白页面的情况。
需要注意的是,虽然自定义ViewPager可以解决这个问题,但这并不是一个理想的解决方案。我们希望谷歌能够在框架中提供一种加载空白视图或静态布局的选项,以在滑动动画进行时创建片段之前显示空白页面。许多应用程序在切换标签时都会进行请求,为什么我还要实现下拉刷新呢?这毫无意义。谷歌在框架的几乎所有小部件中都显示出了严重的缺乏常识。
以下是整理的
如何使ViewPager只在用户滑动到页面时加载该页面?
问题:如何使ViewPager只在用户滑动到页面时加载该页面?
解决方法:编写自己的ViewPager。如Jani的回答所指出,ViewPager对每个页面的最小预加载限制为每一侧都是1。
这是为了保证滑动动画的流畅性。否则,如果我们要等待您设置下一个页面的UI,用户的滑动将被冻结,或者滑动到空白内容,直到您建立该UI所需的时间。
这不是借口。是的,框架应该提供加载空白视图(或静态(廉价)布局)的选项,在创建片段之前(滑动动画正在进行时)。
这使得没有意义。在几乎所有小部件中,谷歌都显示了严重的缺乏常识。
问题的原因是ViewPager的setOffscreenPageLimit(0)方法没有效果。这个方法用于设置ViewPager在滑动时预加载的页面数量,参数传入0表示只加载当前显示的页面。然而,由于ViewPager的设计,它至少会预加载一个页面,以保证滑动动画的流畅性。
解决方法是自定义ViewPager。通过自定义ViewPager,我们可以重写其预加载页面的逻辑,实现只在用户滑动到某个页面时才加载该页面的功能。这样就能避免在滑动过程中出现冻结或空白页面的情况。
需要注意的是,虽然自定义ViewPager可以解决这个问题,但这并不是一个理想的解决方案。我们希望谷歌能够在框架中提供一种加载空白视图或静态布局的选项,以在滑动动画进行时创建片段之前显示空白页面。许多应用程序在切换标签时都会进行请求,为什么我还要实现下拉刷新呢?这毫无意义。谷歌在框架的几乎所有小部件中都显示出了严重的缺乏常识。
问题的原因是ViewPager的setOffscreenPageLimit(0)方法没有任何效果,无法实现每次只加载一个页面的需求。解决方法是使用OnPageChangeListener接口,在页面切换时调用片段中的刷新方法来更新页面。需要设置较高的OffScreenPageLimit值,但这样可以确保每次显示片段时都会进行更新。
下面是示例代码:
pager.setOnPageChangeListener(new OnPageChangeListener() { public void onPageSelected(int position){ ((MyRefreshableFragment)pager.getAdapter().getItem(position)).refresh(); } public void onPageScrolled(int arg0, float arg1, int arg2) {} public void onPageScrollStateChanged(int arg0) {} });
需要注意的是,代码中的getItem方法并不是ViewPager提供的方法,需要自行实现获取当前显示的片段或使用visibleHint属性的hack方法来获取。
问题原因:
调用ViewPager的setOffscreenPageLimit(0)方法设置预加载页面的数量为0时,无效果。会出现错误提示:"Requested offscreen page limit 0 too small; defaulting to 1"。
解决方法:
无法直接实现只加载一页的效果。可以通过以下方法间接实现只加载一页的效果:
1. 设置setOffscreenPageLimit(1):
调用ViewPager的setOffscreenPageLimit(1)方法,设置预加载页面的数量为1。这样可以确保只有当前页和相邻的一页被预加载,达到只加载一页的效果。
2. 自定义FragmentPagerAdapter:
继承FragmentPagerAdapter,并重写getItemPosition()方法。在该方法中,返回POSITION_NONE,可以实现每次切换页面时都重新加载页面,达到只加载一页的效果。
3. 使用FragmentStatePagerAdapter:
使用FragmentStatePagerAdapter代替FragmentPagerAdapter。FragmentStatePagerAdapter在切换页面时会销毁非当前页的Fragment,只保留当前页的Fragment,从而实现只加载一页的效果。
以上是解决ViewPager只加载一页的方法,希望对你有所帮助。更多相关信息可以参考:ViewPager.setOffscreenPageLimit(0) doesn't work as expected。