RecyclerView dentro de ScrollView no funciona
Estoy intentando implementar un diseño que contenga RecyclerView
y ScrollView
en 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é:
- Vista de tarjeta dentro del
ScrollView
(ahoraScrollView
contieneRecyclerView
): puede ver la tarjeta hasta el archivoRecyclerView
. - La idea inicial fue implementar esto
ViewGroup
usandoRecyclerView
en lugar deScrollView
donde uno de sus tipos de vistas seaCardView
, pero obtuve exactamente los mismos resultados que conScrollView
.
usar NestedScrollView
en lugar deScrollView
Consulte el documento de referencia NestedScrollView para obtener más información.
y agrega recyclerView.setNestedScrollingEnabled(false);
a tuRecyclerView
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 RecyclerView
no layout_height=wrap_content
abordar todos los elementos internos ScrollView
, lo que solo ocurre en las versiones Marshmallow y Nougat+ (API 23, 24, 25).
(ACTUALIZACIÓN: Reemplazar ScrollView
con android.support.v4.widget.NestedScrollView
trabajos 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 RecyclerView
with 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:
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;
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) {
}
});