当页面滚动时滚动 ViewPager 的 RecyclerView
Scroll ViewPager's RecyclerView when page gets scrolled
我有一个 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()
调用。
您可以通过不同的方式解决这个问题。
最简单的方法是通过调用 viewPager.setOffscreenPageLimit(3)
增加屏幕外缓存页面的数量(例如 3 个)- 更多 ViewPager.setOffScreenPageLimit(int)。如果每次用户滑动时都依赖页面刷新,这可能是个问题。
另一种选择是为您的 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);
}
}
我有一个 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()
调用。
您可以通过不同的方式解决这个问题。
最简单的方法是通过调用
viewPager.setOffscreenPageLimit(3)
增加屏幕外缓存页面的数量(例如 3 个)- 更多 ViewPager.setOffScreenPageLimit(int)。如果每次用户滑动时都依赖页面刷新,这可能是个问题。另一种选择是为您的
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); } }