Personalizar RecyclerView LayoutManager no fling (sin problemas)
Estoy trabajando en una aplicación que se parece algo a esto:
- SmoothScrollToPosition no funciona?
- Android WebView desplazamiento suave
- Mejora de la suavidad de desplazamiento en un ListView de Android
- (Smooth) ScrollToPosition no funciona correctamente con RecyclerView
- RecyclerView no se desplaza como se esperaba
El RecyclerView utiliza un LayoutManager personalizado con una implementación personalizada de "scrollVerticallyBy"
Primero de. El recyclerview desplaza la mantequilla lisa y rinde en la manera menos que los 16 ms requeridos. Creo que puedo max i fuera alrededor de 5 ms en un Nexus 5.
Sin embargo, también quiero ser capaz de desplazar el RecyclerView de tocar la vista anterior (es un RelativeLayout).
Aquí está el problema:
1) Si sólo envío el onTouchEvents el desplazamiento es la mantequilla suave. Sin embargo, RecyclerView.fling (…) nunca se invoca y el desplazamiento sólo funciona siempre y cuando el dedo toque la pantalla. No flinging que se siente muy incómodo.
@Override public boolean onTouchEvent(MotionEvent event) { return mRecyclerView.onTouchEvent(event); }
2) Si anula .fling (…) en el RecyclerView puedo obtener "flinging" para trabajar usando un Scroller. Esto funciona, pero causa algunos extraños grandes retrasos.
@Override public void onDraw(Canvas canvas) { super.onDraw(canvas); if (mScroller.computeScrollOffset()) { Log.d("RecyclerView", "(ondraw) Y: " + mScroller.getCurrY()); scrollBy(0, mScroller.getCurrY()- mLastY); mLastY = mScroller.getCurrY(); postInvalidateDelayed(16); // 60 Hz } } @Override public boolean fling(int velocityX, int velocityY) { mLastY = 0; mScroller.fling(0, 0, velocityX, velocityY, 0, 0, -10000 ,10000); return true; }
No estoy seguro de cuál es la forma correcta de hacerlo. Me siento así si no estoy anulando .fling () y obligar a mi aplicación a llamar repetidamente scrollBy () utilizando el Scroller el desplazamiento está funcionando de manera diferente.
Sospecho que esto puede tener algo que ver con "startSmoothScroll" y "smoothScrollToPosition" que no he sobrescrito. Honestamente no sé lo que smoothscrolling es, pero suena relevante para este problema 🙂