如何使我的ViewPager一次只加载一个页面,即setOffscreenPageLimit(0);

我明白我可以给setOffscreenPageLimit(int)的最低数量是1,但我需要一次加载一个页面,因为内存的问题。

我将不得不使用旧式的tabhost等? 或者有没有办法/黑客我可以让我的viewPager一次加载一个页面?

我的适配器使用ViewHolder模板扩展了BaseAdapter。

Solutions Collecting From Web of "如何使我的ViewPager一次只加载一个页面,即setOffscreenPageLimit(0);"

据我所知,这是不可能的,当使用ViewPager 。 至less不是,当你想你的网页可以刷卡。

因此,解释非常简单:

当你在两个页面之间滑动时,当两个页面都需要可见时,有一个Point,因为当两个页面中的一个甚至不存在时, 你不能在两个页面之间滑动

看到这个问题更多: ViewPager.setOffscreenPageLimit(0)不能按预期方式工作

CommonsWare在他的回答中提供了一个很好的解释。

但我需要一次加载一个页面,因为内存问题。

这假定你正在OutOfMemoryError s。

我将不得不使用旧式的tabhost等?

是,或FragmentTabHost ,或操作栏选项卡。

或者有没有办法/黑客我可以让我的viewPager一次加载一个页面?

不,因为ViewPager需要多个页面才能进行滑动animation。 你可以通过使用ViewPager和滑动来看到这一点。

或者,您可以尝试解决您感知的内存问题。 假设这个应用程序和今天早些时候报告的应用程序是一样的,那么你只能使用7MB的堆空间。 这只会导致OutOfMemoryError如果你的剩余堆高度分散。 有内存pipe理的策略(例如, inBitmap中的BitmapOptions用于创build来自外部源的位图),这有助于解决这种碎片问题。

我的适配器使用ViewHolder模板扩展了BaseAdapter。

BaseAdapter用于AdapterView ,而不是ViewPager

我有同样的问题,我find了解决scheme:

脚步:

1)首先从这个链接下载CustomViewPager类。

2)使用这样的类:

在Java中:

 CustomViewPager mViewPager; mViewPager = (CustomViewPager) findViewById(R.id.swipePager); mViewPager.setOffscreenPageLimit(0); 

在XML中:

 <com.yourpackagename.CustomViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipePager" android:layout_width="match_parent" android:layout_height="match_parent"/> 

现在只能一次加载一个页面。

谢谢。

你可以使用FragmentStatePagerAdapter 。 这使得寻呼机能够保持更less的内存。 它完全从FragmentManager中删除Fragment实例,一旦他们不可及。 已删除片段的状态存储在FragmentStatePagerAdapter中。 一旦你返回到一个现有的项目和状态恢复,碎片实例重新创build。

 public static class MyAdapter extends FragmentStatePagerAdapter { public MyAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { return ArrayListFragment.newInstance(position); } } 

我知道这是一个旧的post,但我偶然发现这个问题,发现一个很好的解决scheme,如果你的加载片段。 简单地说,通过覆盖setUserVisibleHint()来检查用户是否看到片段。 之后加载数据。

  @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { getData(1, getBaseUrl(), getLink()); } }