java - 如何使用偏移 Recycler View 进行自动平滑滚动?

标签 java android android-recyclerview

存在这样的问题,我有水平RecyclerView,其中每个单元格都小于屏幕宽度。

所以我在这里找到了解决方案

RecyclerVIew auto scroll to display all the elements as in News Feed etc.,

如果一个单元格占据屏幕的整个宽度,则所有工作都很好,否则(如果每个单元格占据屏幕宽度的 95%),每次自动滑动都会将单元格放置在屏幕的开头(右侧),这是合乎逻辑的。因此,在一个可见单元格的末尾,它是另一个单元格的开始

enter image description here

看起来不太好。我需要这个单元格像这样位于屏幕中间。

我需要查看上一个单元格 - 当前单元格 - 下一个单元格

enter image description here

现在我想解释一些如何使当前平滑滚动的魔法(正如我在上面的链接中提到的)

我的CustomLinnearLayoutManager中的这个方法

@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position)
{
    LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext())
    {
        @Override
        public PointF computeScrollVectorForPosition(int targetPosition)
        {
            return SmoothLayoutManager.this.computeScrollVectorForPosition(targetPosition);
        }

        @Override
        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics)
        {
            return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
        }
    };

    linearSmoothScroller.setTargetPosition(position);
    startSmoothScroll(linearSmoothScroller);
}

但是这个方法无需偏移即可工作

我发现了另一种可以提供所需偏移量的方法

scrollToPositionWithOffset(final int position, final int offset)

它看起来正是我所需要的,但这种方法不需要平滑的动画。

所以,最终我的问题是:如何将动画逻辑从第一种方法应用到第二种方法(带有偏移量)

欢迎提问

最佳答案

要自动捕捉并在 RecyclerView 中心显示一项,您只需使用 LinearSnapHelper 即可,如下所示:

LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);

如果您想以编程方式滚动到特定项目,LinearSnapHelper 也可以处理捕捉功能。

SmoothScroller smoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
        @Override
        protected int getVerticalSnapPreference() {
            return LinearSmoothScroller.SNAP_TO_ANY;
        }

        @Override
        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
            return 120f / displayMetrics.densityDpi;
        }
    };

...

smoothScroller.setTargetPosition(position);
recyclerView.getLayoutManager().startSmoothScroll(smoothScroller);

这是视觉结果:
.

......................手动滚动...................... ......以编程方式滚动............

Example Example

关于java - 如何使用偏移 Recycler View 进行自动平滑滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52964701/

相关文章:

java - Android FirebaseRecyclerAdapter 未填充 RecyclerView

android - ScrollView 内的可点击 LinearLayout 不会触发 onClick

android - 海量数据+Objectbox+RecyclerView适配器

java - InstallCert.java 从哪里获取服务器证书

java - java如何处理StackOverflowError?

java - getDefaultProcessEngine() 返回 null

java - 使用不同的 T 类调用 print(List<T> a, T b) 时出现错误

android - 获取android操作系统版本表

java - 滑动回收站 View 无法正常工作

android - DiffUtil 和 notificationItemInserted 之间的区别