Reescriba el método smoothScrollToPosition para layoutmanaer
Referencia: Código fuente: smoothScrollToPosition
package com.google.android.material.datepicker;
import android.content.Context;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSmoothScroller;
import androidx.recyclerview.widget.RecyclerView;
import android.util.DisplayMetrics;
/**
* Layout manager for {@link MaterialCalendar} that slows the scroll down to appear smoother for
* months.
*/
class SmoothCalendarLayoutManager extends LinearLayoutManager {
/** Default value in {@link LinearSmoothScroller} is 25f */
private static final float MILLISECONDS_PER_INCH = 100f;
SmoothCalendarLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
@Override
public void smoothScrollToPosition(
RecyclerView recyclerView, RecyclerView.State state, int position) {
final LinearSmoothScroller linearSmoothScroller =
new LinearSmoothScroller(recyclerView.getContext()) {
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return MILLISECONDS_PER_INCH / displayMetrics.densityDpi;
}
};
linearSmoothScroller.setTargetPosition(position);
startSmoothScroll(linearSmoothScroller);
}
}
GridLayoutManager manager = new GridLayoutManager(getContext(), 2, LinearLayoutManager.VERTICAL, false){
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
super.smoothScrollToPosition(recyclerView, state, position);
LinearSmoothScroller smoothScroller =
new LinearSmoothScroller(recyclerView.getContext()) {
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
// 返回:滑过1px时经历的时间(ms)。
return 150f / displayMetrics.densityDpi;
}
@Override
public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
return boxStart - viewStart;
}
};
smoothScroller.setTargetPosition(position);
startSmoothScroll(smoothScroller);
}
};