En mi proyecto, uso un RecyclerView que solo quiero desplazar llamando al método startSmoothScroll() de LayoutManager:
private fun next(){ val layoutManager = pager.layoutManager as BattlePageLayoutManager layoutManager.startSmoothScroll(smoothScroller(layoutManager.findFirstVisibleItemPosition() + 1)) layoutManager.finishScroll() }No quiero que el usuario pueda desplazarse manualmente, por ejemplo, deslizando el dedo.
Ya traté de lograr esto anulando el método onInterceptTouchEvent() del FrameLayout principal.
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { if (ev.actionMasked == MotionEvent.ACTION_DOWN){ startClickTime = System.currentTimeMillis() startX = ev.x startY = ev.y } val allowEvent = (System.currentTimeMillis() - startClickTime) < 1000 && (startX-ev.x).absoluteValue < 15 && (startY-ev.y).absoluteValue < 15 return !allowEvent }Eso funcionó básicamente, pero ocurrió que después de tocar dos veces la Vista, los usuarios pueden desplazarse por sí mismos.
¿Tienes alguna otra idea para abordar esto?
¿Intentó anular el método canScrollVertical() en el LayoutManager?
mLayoutManager = new LinearLayoutManager(getActivity()) { @Override public boolean canScrollVertically() { return false; } };Editar: cree su propia implementación de RecyclerView que deshabilita el evento táctil mientras se realiza el desplazamiento. Luego, debe cambiar la clase RecyclerView en el archivo xml y Fragment/Activity con él.
Encuentre aquí un ejemplo en Kotlin
class MyRecyclerView : RecyclerView { constructor(context: Context) : super(context) {} constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {} constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) {} override fun onInterceptTouchEvent(e: MotionEvent): Boolean { return if (scrollState != RecyclerView.SCROLL_STATE_IDLE) false else super.onInterceptTouchEvent(e) } }y en Java
public class MyRecyclerView extends RecyclerView { public MyRecyclerView(Context context) { super(context); } public MyRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public MyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent e) { if(getScrollState() != SCROLL_STATE_IDLE) return false; return super.onInterceptTouchEvent(e); } }Es posible que desee bloquear la interacción del usuario con RecyclerView , no con FrameLayout en sí.
Compruebe RecyclerView.OnItemTouchListener .
En su RecyclerView , puede implementar OnItemTouchListener y anular todos los métodos para no hacer nada.
Eso bloqueará la interacción del usuario con RecyclerView , haciendo que el desplazamiento no suceda.