水平 recylerview 的同步滚动与 viewpager 滚动
Sync scroll of horizontal recylerview with viewpager scroll
我有一个带有一些值的视图寻呼机,recylerview 上方的 recycler view 的计数相同(就像一个 tablayout)
我已经使用 snap helper 实现了该功能,并且所有工作正常我唯一想要的是我想将 recyclerview 的滚动与 viewpager 滚动同步,这是我无法实现的。
下面是我想要达到的效果
但我得到的是如下所示
我覆盖了查看页面的滚动但是没有用
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
myRecyler..scrollBy(positionOffsetPixels,0);
}
但是我也试过它的奇怪行为scrollToPositionWithOffset
layoutManagerStart.scrollToPositionWithOffset(position,positionOffsetPixels);
但是都失败了,我使用了 snap helper 所以选中的项目将在第一个位置。
谁能帮我实现上面那个效果
我也遇到了同样的问题,因为你没有提供正确的信息正在添加以下代码段
您需要将 viewpager 的 positionoffset 传递给函数,正如您所说的 scrollToPositionWithOffset 是正确的方法,但您需要在此之前进行一些计算。
检查以下代码
protected void scrollToTab(int position, float positionOffset) {
int scrollOffset = 0;
if (mItemWidth == 1 && yourrecylerview != null) {
View child = yourrecylerview.getChildAt(0);
if (child != null) {
mItemWidth = child.getMeasuredWidth() * 2;
}
}
View selectedView = yourlayoutmanager.findViewByPosition(position);
View nextView = yourlayoutmanager.findViewByPosition(position + 1);
if (nextView != null) {
if (selectedView != null) {
int width = yourrecylerview.getMeasuredWidth();
float sLeft = (position == 0) ? 24 : width / mItemWidth - selectedView.getMeasuredWidth() / mItemWidth; // left edge of selected tab
float sRight = sLeft + selectedView.getMeasuredWidth(); // right edge of selected tab
float nLeft = width / mItemWidth - nextView.getMeasuredWidth() / mItemWidth; // left edge of next tab
float distance = sRight - nLeft; // total distance that is needed to distance to next tab
float dx = distance * positionOffset;
scrollOffset = (int) (sLeft - dx);
} else {
scrollOffset = (mItemWidth/2) * (-1);
//mRequestScrollToTab = true;
}
if (position != 0) {
// scrollOffset=scrollOffset-10;
}
mIndicatorPosition = position;
yourrecylerview.stopScroll();
if ((position != mOldPosition || scrollOffset != mOldScrollOffset)) {
yourlayoutmanager.scrollToPositionWithOffset(position, scrollOffset);
}
}
else
{
//Sometimes view go null for handling that situvation
yourrecylerview.scrollToPosition(position);
yourviewpager.setCurrentItem(position);
}
mOldPosition = position;
mOldScrollOffset = scrollOffset;
mOldPositionOffset=positionOffset;
}
在你的viewpager的addOnPageChangeListener上添加上面的方法
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
scrollToTab(position, positionOffset);
}
我已经制作了一个示例,如果您需要进一步验证,可以帮助您
RecyclerParallelViewPager
转到 link 查看解决方案
希望对您有所帮助
我有一个带有一些值的视图寻呼机,recylerview 上方的 recycler view 的计数相同(就像一个 tablayout)
我已经使用 snap helper 实现了该功能,并且所有工作正常我唯一想要的是我想将 recyclerview 的滚动与 viewpager 滚动同步,这是我无法实现的。
下面是我想要达到的效果
但我得到的是如下所示
我覆盖了查看页面的滚动但是没有用
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
myRecyler..scrollBy(positionOffsetPixels,0);
}
但是我也试过它的奇怪行为scrollToPositionWithOffset
layoutManagerStart.scrollToPositionWithOffset(position,positionOffsetPixels);
但是都失败了,我使用了 snap helper 所以选中的项目将在第一个位置。
谁能帮我实现上面那个效果
我也遇到了同样的问题,因为你没有提供正确的信息正在添加以下代码段
您需要将 viewpager 的 positionoffset 传递给函数,正如您所说的 scrollToPositionWithOffset 是正确的方法,但您需要在此之前进行一些计算。
检查以下代码
protected void scrollToTab(int position, float positionOffset) {
int scrollOffset = 0;
if (mItemWidth == 1 && yourrecylerview != null) {
View child = yourrecylerview.getChildAt(0);
if (child != null) {
mItemWidth = child.getMeasuredWidth() * 2;
}
}
View selectedView = yourlayoutmanager.findViewByPosition(position);
View nextView = yourlayoutmanager.findViewByPosition(position + 1);
if (nextView != null) {
if (selectedView != null) {
int width = yourrecylerview.getMeasuredWidth();
float sLeft = (position == 0) ? 24 : width / mItemWidth - selectedView.getMeasuredWidth() / mItemWidth; // left edge of selected tab
float sRight = sLeft + selectedView.getMeasuredWidth(); // right edge of selected tab
float nLeft = width / mItemWidth - nextView.getMeasuredWidth() / mItemWidth; // left edge of next tab
float distance = sRight - nLeft; // total distance that is needed to distance to next tab
float dx = distance * positionOffset;
scrollOffset = (int) (sLeft - dx);
} else {
scrollOffset = (mItemWidth/2) * (-1);
//mRequestScrollToTab = true;
}
if (position != 0) {
// scrollOffset=scrollOffset-10;
}
mIndicatorPosition = position;
yourrecylerview.stopScroll();
if ((position != mOldPosition || scrollOffset != mOldScrollOffset)) {
yourlayoutmanager.scrollToPositionWithOffset(position, scrollOffset);
}
}
else
{
//Sometimes view go null for handling that situvation
yourrecylerview.scrollToPosition(position);
yourviewpager.setCurrentItem(position);
}
mOldPosition = position;
mOldScrollOffset = scrollOffset;
mOldPositionOffset=positionOffset;
}
在你的viewpager的addOnPageChangeListener上添加上面的方法
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
scrollToTab(position, positionOffset);
}
我已经制作了一个示例,如果您需要进一步验证,可以帮助您 RecyclerParallelViewPager 转到 link 查看解决方案
希望对您有所帮助