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

cod*_*441 34 android android-viewpager

我理解我能给出的最低数字setOffscreenPageLimit(int)是1.但我需要一次加载一页因为内存问题.

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

我的适配器使用ViewHolder patern扩展BaseAdapter.

Ron*_*kar 32

我遇到了同样的问题,我找到了解决方案:

脚步:

1)首先下载CustomViewPager从类链接.

2)使用如下所述的类:

在Java中:

CustomViewPager mViewPager;
mViewPager = (CustomViewPager) findViewById(R.id.swipePager);
mViewPager.setOffscreenPageLimit(0);
Run Code Online (Sandbox Code Playgroud)

在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"/>
Run Code Online (Sandbox Code Playgroud)

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

PS:根据问题的要求,我已经发布了解决方案Viewpager.我还没试过同样的TabLayout事情.如果我找到任何解决方案,我会更新答案.

  • 无法使用TabLayout进行设置,请提供建议 (5认同)
  • tabLayout.setupWithViewPager(customeViewPager); 这里Tablayout不接受Custom类. (3认同)
  • @ RRR_1173,使用viewpager的任何一般示例,只需将Viewpager替换为CustomViewPager.你可以在这里找到一般的例子:http://www.androidhive.info/2013/10/android-tab-layout-with-swipeable-views-1/你只需要提供CustomClass. (2认同)
  • 无法使用TabLayout进行设置,请提供建议 (2认同)
  • 谢啦。你救了我的命!!!您应该得到奥斯卡奖!!我一直在努力使其工作5天!!! (2认同)
  • 我试图扩展customeviewpager而不是ViewPager,但是在Customviewpager中没有解决setPageTransformer方法,那么如何使用customeviewpager实现垂直滑动? (2认同)

Phi*_*oda 17

据我所知,使用ViewPager时无法做到这一点.至少不是,当您希望您的页面可以刷卡时.

因此解释非常简单:

当您在两个页面之间滑动时,当两个页面都需要可见时,有一个点,因为当其中一个页面之一甚至不存在时,您无法在两个页面之间滑动.

有关更多信息,请参阅此问题:ViewPager.setOffscreenPageLimit(0)无法按预期工作

CommonsWare在他的回答评论中提供了很好的解释.

  • 如果我不希望View pager的滑动功能怎么办?。我正在像这样使用NonSwipeableViewPager https://github.com/nuuneoi/TheCheeseLibrary/blob/master/src/main/java/com/inthecheesefactory/thecheeselibrary/view/NonSwipeableViewPager.java (2认同)

Com*_*are 11

但我需要一次加载一页因为内存问题.

这假设你得到了OutOfMemoryErrors.

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

是,或FragmentTabHost,或操作栏标签.

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

不,因为ViewPager滑动动画一次需要多个页面的简单原因.你可以通过使用ViewPager和滑动来看到这一点.

或者,您可以修复您感知到的内存问题.假设这个应用程序与您今天早些时候报告的应用程序相同,那么您只使用7MB的堆空间.OutOfMemoryError如果您的剩余堆高度分散,那只会导致s.有内存管理策略(例如,inBitmapBitmapOptions创建从外部源位图)能够帮助解决这种碎片化的担忧.

我的适配器使用ViewHolder patern扩展BaseAdapter.

BaseAdapter是用于AdapterView,而不是ViewPager.


小智 6

我对此有一个答案。上面所说的 setUserVisibleHint() 方法已被弃用,您可以使用 setMaxLifecycle() 方法。要仅加载可见片段,您必须在 viewpager 适配器中将行为设置为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 。IE; 在构造函数中。为了处理片段,请使用片段中的 onResume() 方法。

通过这种方式,您一次只能在 viewpager 中加载一个片段。

public static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
    super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}

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

@Override
public Fragment getItem(int position) {
    return ArrayListFragment.newInstance(position);
}
Run Code Online (Sandbox Code Playgroud)

}

在科特林中:

class MyAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT )
Run Code Online (Sandbox Code Playgroud)

也以同样的方式使用 with FragmentPagerAdapter(现已弃用)


归档时间:

查看次数:

45053 次

最近记录:

6 年,3 月 前