ViewPager屏幕外页面限制

时间:2012-07-25 12:52:04

标签: android android-fragments android-viewpager

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

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

我能想到的另一种方法是在ImageView上设置onHover,只在{{1}}上下载图片,但该监听器仅在4.0及更高版本中可用

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

7 个答案:

答案 0 :(得分:38)

  

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

没有。它已设置为最小可能值:查看页面每侧一页。这对于使动画效果起作用是必要的 - 你可以同时看到两个片段(原始片段和新片段)的一部分。

  

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

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

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

答案 1 :(得分:29)

只需将屏幕外限制设为一个。

ViewPager mViewpager = (ViewPager)findView....
mViewPager.setOffscreenPageLimit(1);

答案 2 :(得分:6)

  

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

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

答案 3 :(得分:3)

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

<android.support.v4.view.ViewPager
    [...]
    app:offscreenPageLimit="@{1}"
    [...]
</android.support.v4.view.ViewPager>

答案 4 :(得分:2)

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

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

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

@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();
    }
}

答案 5 :(得分:1)

为避免在用户没有实际滚动到片段的情况下下载图像,您可以覆盖&#34; setUserVisibilityHint(boolean visibleToUser)&#34;并且仅在&#34; visibleToUser&#34;变得真实

答案 6 :(得分:0)

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

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

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