RecyclerView dentro de ScrollView no funciona

Resuelto royB asked hace 54 años • 26 respuestas

Estoy intentando implementar un diseño que contenga RecyclerViewy ScrollViewen el mismo diseño.

Plantilla de diseño:

<RelativeLayout>
    <ScrollView android:id="@+id/myScrollView">

       <unrelated data>...</unrealated data>

       <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/my_recycler_view" />
    </ScrollView>   
</RelativeLayout>

Problemas: puedo desplazarme hasta el último elemento de ScrollView.

Cosas que probé:

  1. Vista de tarjeta dentro del ScrollView(ahora ScrollViewcontiene RecyclerView): puede ver la tarjeta hasta el archivo RecyclerView.
  2. La idea inicial fue implementar esto ViewGroupusando RecyclerViewen lugar de ScrollViewdonde uno de sus tipos de vistas sea CardView, pero obtuve exactamente los mismos resultados que con ScrollView.
royB avatar Jan 01 '70 08:01 royB
Aceptado

usar NestedScrollViewen lugar deScrollView

Consulte el documento de referencia NestedScrollView para obtener más información.

y agrega recyclerView.setNestedScrollingEnabled(false);a tuRecyclerView

Yang Peiyong avatar May 20 '2016 05:05 Yang Peiyong

Sé que llegué tarde al juego, pero el problema persiste incluso después de que Google solucionó el problema.android.support.v7.widget.RecyclerView

El problema que tengo ahora es RecyclerViewno layout_height=wrap_contentabordar todos los elementos internos ScrollView, lo que solo ocurre en las versiones Marshmallow y Nougat+ (API 23, 24, 25).
(ACTUALIZACIÓN: Reemplazar ScrollViewcon android.support.v4.widget.NestedScrollViewtrabajos en todas las versiones. De alguna manera me perdí la prueba de la solución aceptada . Agregué esto en mi proyecto github como demostración).

Después de probar diferentes cosas, encontré una solución que soluciona este problema.

Aquí está mi estructura de diseño en pocas palabras:

<ScrollView>
  <LinearLayout> (vertical - this is the only child of scrollview)
     <SomeViews>
     <RecyclerView> (layout_height=wrap_content)
     <SomeOtherViews>

La solución es envolver el RecyclerViewwith RelativeLayout. ¡¡¡No me preguntes cómo encontré esta solución!!!¯\_(ツ)_/¯

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

El ejemplo completo está disponible en el proyecto GitHub : https://github.com/amardeshbd/android-recycler-view-wrap-content

Aquí hay un screencast de demostración que muestra la solución en acción:

Screencast

Hossain Khan avatar Aug 17 '2016 11:08 Hossain Khan

Aunque la recomendación de que

nunca debes poner una vista desplazable dentro de otra vista desplazable

Es un buen consejo, sin embargo, si establece una altura fija en la vista del reciclador, debería funcionar bien.

Si conoce la altura del diseño del elemento del adaptador, puede calcular la altura de RecyclerView.

int viewHeight = adapterItemSize * adapterData.size();
recyclerView.getLayoutParams().height = viewHeight;
Joakim Engstrom avatar Feb 13 '2015 11:02 Joakim Engstrom

En caso de que configurar una altura fija para RecyclerView no funcionara para alguien (como yo), esto es lo que agregué a la solución de altura fija:

mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        int action = e.getAction();
        switch (action) {
            case MotionEvent.ACTION_MOVE:
                rv.getParent().requestDisallowInterceptTouchEvent(true);
                break;
        }
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});
Clans avatar Apr 24 '2015 09:04 Clans