Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: RecyclerView dentro del viewpager vertical

Quiero implementar un reciclerview dentro de un viewpager vertical. Mi distribución actual se parece a la siguiente

VerticalViewpager - Fragment1 - ImageView - Fragment2 - RecyclerView 

Si paso de Fragment1 a Fragment2 todo funciona bien. Soy capaz de desplácese dentro del recyclerview arriba y abajo. El problema se produce si intento deslizar / desplazarse de nuevo a Fragmento1.

Si el usuario se ha desplazado hasta la parte superior de la página de reciclaje, desearía reenviar el siguiente evento "Subir" a la vista vertical. He intentado sobreescribir el método onInterceptTouchEvent , pero desafortunadamente todavía no hay éxito. ¿Ideas por ahí? Gracias por tu ayuda 🙂

  • Desplazamiento vertical automático TextView con texto que contiene un enlace de sitio web
  • Ocultación de ActionBar en RecyclerView / ListView onScroll
  • 7 Solutions collect form web for “Android: RecyclerView dentro del viewpager vertical”

    Necesita deshabilitar el scroll . Intente usar recyclerView.setNestedScrollingEnabled(false);

    1) Necesita usar la biblioteca de soporte 23.2.0 (o) anterior 2) y la altura de recyclerView será wrap_content. 3) recyclerView.setNestedScrollingEnabled (false)

    Pero al hacerlo, el patrón de reciclaje no funciona. (Es decir, todas las vistas se cargarán al mismo tiempo porque wrap_content necesita la altura de recyclerView completa para que dibuje todas las vistas de reciclador de una vez. Trate de no utilizar esta utilidad patrón a menos que sea realmente necesario.

     recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled (RecyclerView recyclerView,int dx, int dy) { int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); if (topRowVerticalPosition >= 0) { //top position } } @Override public void onScrollStateChanged (RecyclerView recyclerView,int newState) { super.onScrollStateChanged(recyclerView, newState); } }); 

    Mediante el uso de este código puede encontrar si el usuario está en la posición superior. En la posición puede hacer que el buscapersonas de vista se mueva a la posición deseada.

    Si tiene acceso a VerticalViewPager desde RecyclerView, puede ampliar RecyclerView y comprobar canScrollVertically(-1) y el evento de toque directo a viewpager

    Usted necesita prohibir nestedscroll en scrollview padre tengo nuevo implemento para esto, puede probar el siguiente enlace https://github.com/liuxiaocong/VerticalViewpage

    Yo tuve el mismo problema. La respuesta de Mr.India fue útil, pero como lo has comentado, sólo funcionaba a veces.

    Lo que hice fue

     recyclerView.setOnTouchListener(new View.OnTouchListener() { public float speed; public VelocityTracker mVelocityTracker; @Override public boolean onTouch(View v, MotionEvent event) { int index = event.getActionIndex(); int action = event.getActionMasked(); int pointerId = event.getPointerId(index); switch (action) { case MotionEvent.ACTION_DOWN: if(mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } else { mVelocityTracker.clear(); } mVelocityTracker.addMovement(event); break; case MotionEvent.ACTION_MOVE: if(mVelocityTracker != null) { mVelocityTracker.addMovement(event); mVelocityTracker.computeCurrentVelocity(1000); speed = VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId); } break; case MotionEvent.ACTION_UP: int topRowVerticalPosition = (recyclerView == null || recyclerView.getChildCount() == 0) ? 0 : recyclerView.getChildAt(0).getTop(); if(speed > 500 && topRowVerticalPosition >= 0) { ReaderFragmentParent parent = (ReaderFragmentParent) getActivity(); ReaderPager pager = parent.getPager(); if(pager != null) { pager.setCurrentItem(pager.getCurrentItem()-1); } } return false; case MotionEvent.ACTION_CANCEL: mVelocityTracker.recycle(); break; } return false; } }); 

    En el ACTION_UP verifico si la velocidad> 500, significa que sube en una velocidad considerada y la topRowVerticalPosition significa que está encima de la recyclerview. Entonces consigo ViewPager y setCurrentItem al artículo anterior.

    Es un poco de un hack sucio, pero era la única manera que encontré para hacer que parezca un buen desplazamiento entre las páginas en el Vertical ViewPager

     mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled (RecyclerView recyclerView,int dx, int dy) { } @Override public void onScrollStateChanged (RecyclerView recyclerView,int newState) { super.onScrollStateChanged(recyclerView, newState); if (!mRecyclerView.canScrollVertically(-1) && newState == 0) { Log.e("canScrollVertically", mRecyclerView.canScrollVertically(-1)+""); verticalViewPager.setCurrentItem(0, true); } } }); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.