Skip to content
On this page

📆 2015-08-21

RecyclerView.smoothScrollToPositionの停止位置を変更する

RecyclerViewのsmoothScrollToPositionが思ったところに止まらないので修正した時のメモ。 LinearLayoutManagerを使っています。

LinearLayoutManager.smoothScrollToPositionが使っているLinearSmoothScrollerですが、 既存の動作ではスクロールの向きによって、

  • SNAP_TO_START:Align child view's left or top with parent view's left or top)
  • SNAP_TO_END: Align child view's right or bottom with parent view's right or bottom)

を切り分けています。

どのスクロールの向きでも SNAP_TO_START を利用させたいので、 LinearLayoutManagerをカスタマイズしました。

java
public class CustomLayoutManager extends LinearLayoutManager {

    public CustomLayoutManager(Context context) {
        super(context);
    }

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

                    @Override
                    protected int getVerticalSnapPreference() {
                        return mTargetVector == null || mTargetVector.y == 0
                               ? SNAP_TO_ANY : SNAP_TO_START;
                    }
                };
        linearSmoothScroller.setTargetPosition(position);
        startSmoothScroll(linearSmoothScroller);
    }
}

あとはRecyclerViewへセットして

java
recyclerView.setLayoutManager(new CustomLayoutManager(context);

smoothScrollToPositionを適当な時に呼び出します。

java
recyclerView.smoothScrollToPosition(position);

Released under the MIT License.