30

有没有办法绕过正常行为ViewPager及其屏幕外页面限制?MyViewPager包含四个fragments,每个包含一个gridview图像。我遇到的问题是,在实例化时ViewPager,会创建两个fragments,这导致同时从 catch 下载/获取大约 20 个图像(每个片段大约 10 个)。是否可以禁用屏幕外页面限制?

我的目标是仅在fragment选择 a 时或仅当用户悬停图像时才下载图像。实现此目的的一种方法是使用onPageSelected侦听器并设置一个标志,该标志告诉GridViewAdapter它是否允许下载图像。

我能想到的第二种方法是在 上设置 a HoverListenerImageView并且只在 上下载图像onHover,但该监听器仅在 4.0 及更高版本中可用。

有没有更好的方法来实现这一目标?

4

7 回答 7

46

是否可以禁用屏幕外页面限制?

不。它已经设置为可能的最小值:查看页面的每一侧都有一个页面。这是让动画效果正常工作所必需的——您可以同时看到两个片段(原始片段和新片段)的一部分。

我的目标是仅在选择片段时下载图像,或者仅在用户悬停图像时下载图像。

然后使用占位符图像加载您的网格,并且在页面更改之前不要加载真实图像。

另外,请注意,“悬停”意味着某种鼠标或类似的指针,大多数 Android 设备上都没有使用。

于 2012-07-25T13:16:33.330 回答
34

只需将屏幕外限制设置为 1。

ViewPager mViewpager = (ViewPager)findView....
mViewPager.setOffscreenPageLimit(1);
于 2012-07-25T12:58:30.273 回答
5

我的目标是仅在选择片段时下载图像

您可以setUserVisibleHint(boolean isVisibleToUser)在 ViewPager 中使用片段的回调。

于 2016-05-18T09:36:21.760 回答
2

处理viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()

在其中,在使用position + 1前后删除额外的视图(即限制寻呼机仅加载 3 个页面:当前、上一个和下一个。position - 1viewPager.removeViewAt(int)

然后你应该destroyItem在 viewpager 适配器中recycle()处理被破坏视图中的位图。

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    LinearLayout layout = (LinearLayout) object;
    ((ViewPager) container).removeView(layout);
    ImageView imgDisplay = (ImageView) layout.findViewById(R.id.quranPage);
    Drawable drawable = imgDisplay.getDrawable();
    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        Bitmap bitmap = bitmapDrawable.getBitmap();
        if (bitmap != null) //when reading page fails, this will be null
            bitmap.recycle();
    }
}
于 2015-11-01T03:20:01.700 回答
2

您也可以使用 Android 数据绑定在 xml 中执行此操作:

<android.support.v4.view.ViewPager
    [...]
    app:offscreenPageLimit="@{1}"
    [...]
</android.support.v4.view.ViewPager>
于 2016-11-16T07:43:45.343 回答
1

为了避免在没有用户实际滚动到片段的情况下下载图像,您可以覆盖“setUserVisibilityHint (boolean visibleToUser)”并仅在“visibleToUser”变为 true 时加载图像

于 2017-09-12T00:57:42.413 回答
0

mViewPager.setOffscreenPageLimit(1);不会给你想要的,如果它还没有加载,它将加载邻居片段(这意味着它将加载 2 个片段)。

假设您想一次加载所有片段(4 个片段),则仅使用setOffscreenPageLimit(3),否则避免使用setOffscreenPageLimit

我认为您无法更改 viewpager 加载邻居片段的默认行为。

于 2017-07-13T13:18:54.283 回答