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);