我有一个recylerview,其左侧偏移25dp。意思是可以从左边看到一个项目,以表明列表中有东西,最左边的项目被卡入到位,如我可怕的图中所示。 https://imgur.com/a/K4Z758G。
我希望能够平滑滚动到列表中数字1的位置。我已经实现了无法顺利使用的行为;
layoutManager.scrollToPositionWithOffset(position, 25)
其中25是偏移量。但这只是跳线。我也尝试过;
smoothScrollToPosition(position)
没有成功。
我最新使用的是SmoothScroller,它可以工作,但只能在一个方向上正确地工作。如果我的新位置在当前位置之后,则可以正常工作,但是如果它在当前位置之前,则在新位置之前的位置的一半处移动(请参见图中的项目0),然后再返回到1(不是)非常好。我了解这可能与我的SmoothScroller中的计算有关;
RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(getContext()) {
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
@Override
protected int getHorizontalSnapPreference() {
return SNAP_TO_START;
}
@Override
public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);
}
};
smoothScroller.setTargetPosition(itemPosition);
layoutManager.startSmoothScroll(smoothScroller);
}
我附在RecylerView上的SnapHelper是此帖子答案的精简版-How to enable a PagerSnapHelper to snap in both directions in a RecyclerView?。在该方法上有一些填充;
private int distanceToStart(View targetView, OrientationHelper helper, boolean fromEnd) {
if (mIsRtlHorizontal && !fromEnd) {
return distanceToEnd(targetView, helper, true);
}
return helper.getDecoratedStart(targetView) - helper.getStartAfterPadding() **- 25**;
}
我在开头添加了25个填充的地方。出于所有意图和目的,它可以按计划中其他位置的预期进行工作,但不适用于我当前的用例。我了解我的问题可能与之有关;
@Override
public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);
}
但是,环顾四周后,几乎没有关于其工作原理和示例的信息(除了我从上面获得的当前计算方法之外,如上所述)。