android - 当页面滚动时滚动 ViewPager 的 RecyclerView

标签 android android-viewpager android-recyclerview

我有一个 ViewPager,其中有几个 RecyclerView 作为页面。我想实现在用户开始滚动页面后其他页面上的 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 不会滚动。我想我不知何故需要同步这个方法。

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

最佳答案

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

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

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

您可以通过不同的方式解决这个问题。

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

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

    // 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);
    }
    

    最后是你的 view pager 滚动监听器

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

关于android - 当页面滚动时滚动 ViewPager 的 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31273815/

相关文章:

android - 我如何确定 Google map 何时在 Android 中说话

android - RecyclerView 中的滚动条颜色

android - maxHeight 不适用于 RecyclerView

android - NestedScrollView 内的水平 RecyclerView,无法垂直滚动

java - 如何将 PreferenceFragment 与 ViewPager 一起使用?

java - HAX 正在运行并且模拟器在快速 virt 模式模拟器中运行。创建模拟器窗口不在 View 中并且重新居中

java - 正则表达式查找括号和引号之间的字符串

android - 将字符串数组传递给 Robotium 类

android - 根据 ViewPager Android 显示菜单项

android - 页面查看器中的 fragment 替换不适用于 API 21