【问题标题】:Scroll ViewPager's RecyclerView when page gets scrolled滚动页面时滚动 ViewPager 的 RecyclerView
【发布时间】:2015-07-07 16:04:13
【问题描述】:

我有一个带有几个 RecyclerViews 作为页面的 ViewPager。我想实现在用户开始滚动页面后其他页面上的 RecyclerViews 移动一定量的功能。

@Override
public void onPageScrolled(int position, float offset, int offsetPx) {
    RecyclerView view1 = getPage(position - 1);
    RecyclerView view2 = getPage(position + 1);

    if(scrollNeeded()) {
      view1.scrollBy(0, 200);
      view2.scrollBy(0, 200);
    }
}

我遇到的问题是,如果我在 ViewPager 中缓慢滚动,一切正常,但如果我快速滚动,一些 RecyclerViews 不会滚动。我想我需要以某种方式同步此方法。

知道如何解决这个问题吗?用户不应该看到该滚动条。

【问题讨论】:

    标签: android android-viewpager android-recyclerview


    【解决方案1】:

    ViewPager 保持 +1 页面左右预加载。这意味着

    • 一开始 - 当前页面和下一个页面
    • 在最后 - 最后一页和上一页
    • 其他任何地方 - 当前、上一个和下一个

    当用户在页面中快速滑动时,实际情况是页面(您的RecyclerView 实例及其适配器)仍在准备中,因此他们错过了scrollBy() 调用。

    你可以用不同的方式解决这个问题。

    1. 最简单的方法是通过调用 viewPager.setOffscreenPageLimit(3) 来增加缓存的屏幕外页面的数量(例如 3 个) - 获取更多 ViewPager.setOffScreenPageLimit(int)。如果您依赖于每次用户滑动时页面刷新,这可能是个问题。

    2. 另一个选项是为您的 RecyclerView 页面创建自定义视图并添加要从外部设置的滚动值,例如

      // in your custom page view
      private RecyclerView.Adapter adapter;
      private boolean needToScroll;
      
      public void setNeedToScroll(boolean needToScroll) {
      
          this.needToScroll = needToScroll;
      
          // if adapter is not null (i.e. already set), scroll as is
          // and set the value to false
          if (adapter != null) {
              this.needToScroll = false;
              scrollBy(0, 200);
          }
      }
      
      // and then in the place where you define your adapter, but after setting it
      if (needToScroll) {
          needToScroll = false;
          scrollBy(0, 200);
      }
      

      最后是你的视图寻呼机滚动监听器

      @Override
      public void onPageScrolled(int position, float offset, int offsetPx) {
          if(scrollNeeded()) {
              Page view1 = getPage(position - 1);
              Page view2 = getPage(position + 1);
              view1.needToScroll(true);
              view2.needToScroll(true);
          }
      }
      

    【讨论】:

    • 知道如何实现这种类型的布局....我有线性布局,在线性布局下面我有标签+查看寻呼机....现在标签中有两个标签我有recyclverview或gridview不同的标签...我想要一旦我开始滚动viewpagers标签数据...它应该从页面顶部滚动并且linearalyout应该走出页面并且用户只能看到用户定义的内容...这是recyclerview数据
    • @Erum 这超出了原始问题的范围。请创建一个新工单,添加具有所需布局的屏幕截图,很可能会比预期更快地得到您的答案。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多