【问题标题】:ViewPager offscreen page limitViewPager 离屏页面限制
【发布时间】:2012-07-25 12:52:03
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我已将屏幕外设置为 1,但在我第一次创建后,屏幕外的片段是谷歌支持地图片段,当我返回时,地图出现并与我的片段重叠,任何想法为什么?
    • @IgnacioGarat:屏幕外限制应该与此无关。听起来您的 PagerAdapter 无法正常工作。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      【解决方案4】:

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

      在其中,使用viewPager.removeViewAt(int) 删除position + 1 之后和position - 1 之前的额外视图(即限制寻呼机仅加载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】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多