tutorial studio recyclerview recycler personalizado listas dinamicas dependency activity android android-recyclerview gridlayoutmanager nestedrecyclerview

android - studio - recyclerview in activity



Recyclerview une todas las vistas al mismo tiempo (5)

Tengo una vista de reciclador vertical (con un GridLayoutManager ) dentro de otra vista de reciclador (con LinearLayoutManager ). El problema al que me enfrento ahora es que la recicladora interna (con GridLayoutManager) enlaza todos sus elementos al mismo tiempo, incluso las vistas que no están en la pantalla en este momento (se llama a onBindViewHolder() para todos sus elementos )

Para darle más información, en mi archivo de diseño, pongo la altura de mi vista de reciclador como wrap_content .

Creo que el problema es que, dado que hay 2 recicladores reciclados anidados, cuando el RV principal quiere medir sus hijos y los hijos es otro RV, en onMeasure() calcula el tamaño necesario para todo el RV, no solo la porción que lo quiere enlazar en la pantalla.

Alguna idea de como resolver esto?

Aquí está el archivo de diseño para mi vista externa de reciclador:

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/component_list" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout>

Y aquí está el código para mi vista interior recicladora:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="@dimen/gutter" android:paddingBottom="@dimen/gutter"> <TextView android:id="@+id/title_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="@dimen/gutter" android:textSize="30sp" android:textColor="@android:color/white" android:fontFamily="sans-serif-thin"/> <android.support.v7.widget.RecyclerView android:id="@+id/my_slider" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>

PD: Estoy usando este delegado de adaptador para mi vista externa de reciclador: https://github.com/sockeqwe/AdapterDelegates


Creo que las recicladoras anidadas son una muy mala idea. Cuando trato de desplazarme, cual reciclador tiene que responder, la persona que regaña, el padre o el niño.

Es por eso que creo que estás buscando la ExpandableListView ? Eso está limitado a solo dos niveles de listados, pero parece que funcionaría según sus necesidades). También resuelve el problema de la solución.

Se vería algo como esto:

EDITAR: incluso las ExpandableListViews anidadas son posibles:

EDITAR: comprueba esta lib para desplazamiento horizontal


Este es un error conocido.
No deberías poner un RecyclerView dentro de otro RecyclerView porque RecyclerView les da a sus hijos un espacio infinito.
De ahí que el RecyclerView interno siga midiendo hasta agotar el conjunto de datos.
Intente establecer setAutoMeasureEnabled (false) en false en el administrador de diseño o puede resolver este problema utilizando un adaptador de envoltura en lugar de la vista de reciclado interno.


Lo primero que debe saber es que, cuando anida distribuciones de desplazamiento, las internas obtendrán la altura infinita permitida, lo que las convertirá en wrap_content. De hecho, es una forma relativamente fácil de solucionar este problema. Supongamos que tengo dos RecyclerView anidados como estos, en este caso orientados verticalmente.

<RecyclerView android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical> <View .../> <!-- other stuff --> <RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"/> </RecyclerView>

El recycler interno aquí vinculará a todos sus hijos inmediatamente cada vez porque, desde su posición, su pantalla tendrá una altura infinita.

La solución es establecer la altura de su recicladora interior en algún valor estático, no en wrap_content ni en match parent, ya que cualquiera de estos simplemente rellenará la vista exterior del reciclador con una vista que estará ligada a la vez debido a su gran altura. Si hace que la altura de la vista interior del reciclador sea la misma que la altura de la pantalla, debería ver que su problema desaparezca.

Aquí hay una implementación que no vinculará a todos los niños a la vez:

<RecyclerView android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical> <View .../> <!-- other stuff --> <RecyclerView android:layout_width="match_parent" android:layout_height="@dimen/screen_height" android:orientation="vertical"/> </RecyclerView>

Tenga en cuenta que layout_height del RecyclerView interno ahora es un valor fijo extraído del archivo de dimensiones. Usted mismo tendrá que aportar un valor razonable para colocar allí.

Nota al margen: Para hacer que todo esto funcione y para que el desplazamiento funcione correctamente, es posible que deba jugar con el parámetro: NestedScrollingEnabled en sus RecyclerViews: hay varios errores conocidos relacionados con esto que puede necesitar solucionar.

es decir: innerRecyclerView.setHasFixedSize(true); e innerRecyclerView.setNestedScrollingEnabled(false) .


Pude resolver mi problema utilizando solo una Recyclerview, donde tiene un diseño de cuadrícula, y en función de los elementos de los componentes que estoy agregando, spancount el spancount de spancount para eso. Básicamente, en lugar de agregar la vista interior del reciclador, agrego los elementos que se suponía que iban a la vista interior del reciclador, a la vista externa del reciclador.


entonces, ¿qué sucede aquí cuando coloca una vista de desplazamiento (sin tamaño fijo debido al contenido del ajuste) dentro de otra vista de desplazamiento (de nuevo no hay un tamaño fijo debido al contenido del ajuste), las vistas de desplazamiento anidado no se procesan.

Entonces hay dos soluciones--

1- O tendrás que pensar en una solución alternativa para las vistas de desplazamiento anidadas 2- Puedes dar a la celda de reciclaje externo una altura fija para que la vista del reciclador interno pueda obtener un diseño fijo para renderizarse.