防止 ViewPager 破坏屏幕外的视图

我有一个 ViewPager 连接到一个片段 PagerAdapter,它显示三个片段。当视图页面离当前位置超过一次滑动时,视图页面似乎会破坏托管片段的视图。

这些视图都是简单的列表,这种优化是完全不必要的,所以我想禁用它。它导致了一些视觉问题,因为这些列表有应用到它们的布局动画,并且这些动画在它们被销毁和重新创建之后被重播。它还显示了每次滚动条介绍动画(其中滚动条简单可见,表明滚动是可能的) ,这可能会分散注意力,用户的当前滚动位置在这个过程中丢失。

它也不会加载第三个片段,直到第一次刷新发生,这是有问题的,因为每个片段处理自己的服务调用,我希望在加载活动时同时启动三个片段。第三个服务呼叫延迟并不理想。

有没有什么方法可以说服 ViewPager 停止这种行为,并将我的所有片段保存在内存中?

49792 次浏览

在支持包的 修订版4中,ViewPager 添加了一个方法,它允许您指定要使用的屏幕外页数,而不是默认的1。

在您的示例中,需要指定2,这样当您在第三页时,第一页不会被销毁,反之亦然。

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

”设置在空闲状态下应该保留在视图层次结构中当前页面两侧的页数。超过这个限制的页面将在需要时从适配器重新创建。”

Http://developer.android.com/reference/android/support/v4/view/viewpager.html#setoffscreenpagelimit(int)

默认情况下,ViewPager 会在您滑动页面时重新创建片段。为了防止这种情况,您可以尝试以下两种方法之一:

在片段的 onCreate ()中,调用 setRetainInstance (true)。

2. 如果片段的数量固定且相对较小,那么在 onCreate ()中添加以下代码:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

如果我没记错的话,第二个选择更有希望。但我建议你两个都试试,看看哪个有用。

选择的答案是好的,但是对我来说不是真的好。这是因为我有很多片段(20-30) ,所以如果我使用 setOffscreen Pagelimit (30) ,用 ViewPager 加载活动将花费很多时间。在我的例子中,我不得不实现 depyItem ()方法(在 ViewPager 的 Adapter 类中)并删除对超级函数的调用。这是伪代码

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
                                                                                             

}

现在如果你想要更多的上下文,这里是整个 ViewPagerAdapter 类

public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> listFragment =
new ArrayList<>();
public ViewPagerAdapter(@NonNull FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}


@NonNull
@Override
public Fragment getItem(int position) {
return listFragment.get(position);
}


@Override
public int getCount() {
return listFragment.size();
}


/*This is the method I was taking about*/
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    

}


public void addFragment(Fragment fragment)
{
listFragment.add(fragment);
notifyDataSetChanged();
}
}