我有一个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,一切正常,但如果我快速滚动,一些RecyclerViews不会滚动。我想我不知何故需要同步这个方法。
知道如何解决这个问题吗?用户不应该看到滚动。
答案 0 :(得分:3)
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);
}
}