RecyclerView horizontal dentro de ViewPager2 | de Daniel Knauf | agosto 2022
Así que desplácese por RecyclerView y no por ViewPager2.
Para una aplicación que muestra eventos deportivos, coloqué un RecyclerView horizontal dentro de un RecyclerView vertical, que a su vez está dentro de un ViewPager2. Tanto el RecyclerView horizontal como el ViewPager2 se desplazan horizontalmente. Entonces, si desplaza la pantalla horizontalmente, ViewPager2 siempre gana porque es la vista principal y consume primero el evento de desplazamiento (video). Mis objetivos para el desplazamiento horizontal eran:
- Habilite el desplazamiento para RecyclerView siempre que pueda desplazarse en la dirección.
- Deje que ViewPager2 se desplace y cambie su página cuando llegue al final de RecyclerView.
Encontré varias soluciones en línea (por ejemplo, nestedScrollingEnabled=true), pero ninguna cubrió completamente mi caso de uso. Terminé usando partes de diferentes soluciones para obtener mi enfoque: el enfoque tiene dos partes: determinar en qué dirección se desplaza el usuario y verificar si el RecyclerView horizontal puede desplazarse en esa dirección. Se agrega un OnItemTouchListener al RecyclerView horizontal que escucha todos los eventos que recibió en onInterceptTouchEvent. MotionEvent no proporciona ninguna información sobre si un usuario se desplaza hacia la izquierda o hacia la derecha. Entonces, para determinar si el usuario se está desplazando, primero se almacena la posición inicial de cada interacción táctil (indicada por MotionEvent.ACTION_DOWN). En segundo lugar, la dirección de desplazamiento se determina comparando la posición x inicial con la posición x del evento activado por el usuario (indicado por MotionEvent.ACTION_MOVE). Una posición x más pequeña indica que el dedo se mueve hacia la izquierda, lo que resulta en un desplazamiento hacia la derecha. La posición de inicio se restablece cuando finaliza el desplazamiento (indicado por MotionEvent.ACTION_UP). Verificar si RecyclerView puede desplazarse hacia la izquierda o hacia la derecha es más fácil porque proporciona su propio método (canScrollHorizontall). La combinación de ambas piezas de información nos dice si RecyclerView debe manejar el evento o no. RecyclerView informa a su vista principal y antepasado cuando está manejando el evento llamando a requestDisallowInterceptTouchEvent. En mi caso, esto evita que ViewPager2 se desplace a la página siguiente.