繁体   English   中英

滚动页面时滚动ViewPager的RecyclerView

[英]Scroll ViewPager's RecyclerView when page gets scrolled

我有一个ViewPager,其中有几个RecyclerViews作为页面。 我想实现以下功能:用户开始滚动页面后,其他页面上的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中缓慢滚动,一切都会正常,但是如果我快速滚动,某些RecyclerView不会滚动。 我想我需要以某种方式同步此方法。

任何想法如何解决这个问题? 用户不应看到该滚动。

ViewPager保持+1页的左右预加载。 意思是

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

当用户真正快速浏览页面时,确实存在页面(您的RecyclerView实例及其适配器)仍在准备中的情况,因此他们错过了scrollBy()调用。

您可以用不同的方法解决此问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM