6

我正在使用带有水平 LinearLayoutManager 的 RecyclerView。

recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false));

为了使适配器项目在中心捕捉,我已将 LinearSnapHelper 附加到 recyclerview。

SnapHelper 助手 = new LinearSnapHelper();

helper.attachToRecyclerView(recyclerView);

现在,我有两种情况,我希望一个项目居中

  1. 当我的活动启动时,它应该启动时将特定项目对齐到中心。
  2. 在回收视图中点击一个项目时,它应该居中。为此,我重写了适配器的 ViewHolder 中的 OnClick 方法。

对于这两种情况,我都在使用

recyclerView.smoothScrollToPosition(位置);

并且项目居中。然而,这发生在一个有弹性的动画中,首先发生一点额外的滚动并发布项目反弹回来。

如何禁用这个有弹性的动画以获得平滑滚动?

我尝试过的东西 - 在 API 下使用,而不是 smoothScrollToPosition

  1. LinearLayoutManager.scrollToPosition()
  2. LinearLayoutManager.scrollToPositionWithOffset()

上述两个 API 都没有提供平滑的滚动,而且项目没有正确居中(因为在 API 调用期间很难确定尚未创建/回收的项目的正确偏移值)

我在 RecyclerView 的文档中找不到任何禁用/覆盖动画的方法。有人可以帮忙吗..

4

1 回答 1

1

解决方案是使用扩展的 LinearLayoutManager:

import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.LinearSmoothScroller;
import android.support.v7.widget.RecyclerView;

public class NoBounceLinearLayoutManager extends LinearLayoutManager {

    public NoBounceLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, final int position) {
        LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
            @Override
            protected int getHorizontalSnapPreference() {
                return position > findFirstVisibleItemPosition() ? SNAP_TO_START : SNAP_TO_END;
            }
        };
        linearSmoothScroller.setTargetPosition(position);
        startSmoothScroll(linearSmoothScroller);
    }
}
于 2018-08-27T11:44:55.880 回答