support last android android-recyclerview android-support-library android-support-design

android - last - El elemento de la vista del reciclador llena la altura completa de la vista del reciclador después de actualizar la biblioteca de soporte de "23.1.1" a "23.2.1"



com.android.support:design 26 (7)

Actualizar

Parece que está actualizando LayoutParam para su View en su Adapter .

Es posible decir esto porque su interfaz de usuario parece absolutamente bien hasta que comience a desplazarse. Esto significa que su XML es correcto tal como está definido en su archivo de diseño XML.

El hecho de que cambie después de comenzar el desplazamiento significa que hay un error lógico en su implementación de onBindViewHolder . Es por eso que el error aparece cuando se desplaza hacia abajo, y luego el error se mantiene cuando se desplaza hacia arriba.

Vieja respuesta

Su problema es que su divisor se ha deshecho:

<View android:layout_width="1px" android:layout_height="match_parent" android:background="?attr/buyPortfolioSeperatorBackground" android:layout_marginRight="5dp" android:layout_marginLeft="5dp" />

Para propósitos de prueba, configúralo en:

<View android:layout_width="1px" android:layout_height="30dp" android:background="?attr/buyPortfolioSeperatorBackground" android:layout_marginRight="5dp" android:layout_marginLeft="5dp" />

¡Asegúrate de cambiar ambos!

Anteriormente, estoy usando las siguientes bibliotecas de soporte antiguas "23.1.1".

compile ''com.android.support:appcompat-v7:23.1.1'' compile ''com.android.support:support-v4:23.1.1'' compile ''com.android.support:preference-v7:23.1.1'' compile ''com.android.support:preference-v14:23.1.1'' compile ''com.android.support:design:23.1.1'' compile ''com.android.support:recyclerview-v7:23.1.1''

Funciona bastante bien. Así es como se ve mi RecyclerView

Ahora, deseo migrar a "23.2.1", debido a algunas correcciones de errores realizadas.

compile ''com.android.support:appcompat-v7:23.2.1'' compile ''com.android.support:support-v4:23.2.1'' compile ''com.android.support:preference-v7:23.2.1'' compile ''com.android.support:preference-v14:23.2.1'' compile ''com.android.support:design:23.2.1'' compile ''com.android.support:recyclerview-v7:23.2.1''

Sin embargo, de repente, todos mis elementos RecyclerView parecen llenar la altura completa de RecyclerView .

Aquí está el fragmento de código de mi archivo de diseño: https://gist.github.com/yccheok/241a0d38d56305a1be24d09b54eb1600

Lo que realmente me "wrap_content" es que, aunque estoy usando "wrap_content" en el diseño de elementos de mi vista de reciclador, no funciona como se esperaba.

No uso ningún gestor de diseño personalizado para mi RecyclerView .

Desde http://developer.android.com/tools/support-library/index.html , me doy cuenta de que 23.2.1 hace varios cambios en RecyclerView esta vez.

  • Se corrigieron errores relacionados con varios métodos de medida de especificaciones. (Número 201856)
  • Se redujo el período de bloqueo en el que RecyclerView no permite cambios de adaptador al calcular un diseño o desplazamiento. (Número 202046)
  • Se notifyItemChanged() un bloqueo al llamar a notifyItemChanged() en un elemento que está fuera de la vista. (Número 202136)
  • Se corrigió un bloqueo que ocurre cuando RecyclerView.LayoutManager agrega y elimina una vista en el mismo paso de medición. (Número 193958)

Lo que más sospecho es https://code.google.com/p/android/issues/detail?id=201856 , ya que implica cambiar varios métodos de especificaciones de medidas

Hasta ahora, trato de reproducir el problema con un proyecto RecyclerView simple, con 23.2.1, ¡pero falló! No tiene "el elemento llena el problema de la altura completa de RecyclerView ". Mi conjetura es que mi proyecto simple no simula la estructura de diseño compleja de mi proyecto de producción. Mi proyecto de producción está teniendo el siguiente diseño

<Activity> <Fragment> <View Pager> <Fragment> <RecyclerView /> </Fragment> </View Pager> </Fragment> </Activity>

Después de la depuración durante unas pocas horas, todavía no puedo encontrar la causa raíz de este problema, ¿alguna pista?

Gracias.

Lo que había intentado

Yo había tratado de cambiar RecyclerView

desde

<android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"

a

<android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content"

Se ve bien inicialmente. Sin embargo, cuando realiza un desplazamiento, la cosa no funciona como se esperaba: https://www.youtube.com/watch?v=U2EChFn6WkI

ACTUALIZACIÓN: finalmente me di cuenta de la causa raíz

¡Es el error a mi lado! Como necesito tener un margen diferente para la última fila, aquí está mi código de adaptador.

@Override public void onBindViewHolder(ViewHolder holder, int position) { final List<TransactionSummary> transactionSummaries = buyArray.transactionSummaries; if (position == transactionSummaries.size() - 1) { holder.itemView.setLayoutParams(lastLayoutParams); } else { holder.itemView.setLayoutParams(normalLayoutParams); }

Desafortunadamente, lastLayoutParams y normalLayoutParams se están inicializando como

normalLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT ); lastLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT );

Usar LinearLayout.LayoutParams.WRAP_CONTENT resuelve el problema.


Creo que esta es la línea problemática:

<View android:layout_width="1px" android:layout_height="match_parent" <!--change this to wrap_content--> android:background="?attr/buyPortfolioSeperatorBackground" android:layout_marginRight="5dp" android:layout_marginLeft="5dp" />

Hay 2 lugares en su elemento de diseño que tiene layout_height = "match_parent". Deberías cambiarlos a wrap_content.


La altura de la vista de reciclaje debe ser solo "wrap_content". La vista de reciclaje manejará la altura si el tamaño de la celda aumenta.

buy_portfolio_fragment.xml

<android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/buyPortfolioListViewBackground" android:requiresFadingEdge="none" android:scrollbars="vertical" android:paddingTop="@dimen/default_tab_layout_height" android:clipToPadding="false" />


Para corregir este error, row_layout debería tener la altura fija o wrap_content ! También tuve este problema y me di cuenta de que la altura de row_layout era match_parent.


Simplemente haga row_layout height a wrap_content para que solo ocupe el espacio de altura real de la fila para todos los elementos.


Tuve un problema similar. Acabó siendo que el reciclador no era el problema. Verifique que las mediciones de sus artículos CardView se traduzcan en algo como esto:

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" ... />

Si no está utilizando CardView, asegúrese de que el elemento que usa en su Adaptador para la vista tenga android:layout_height="wrap_content" y no match_parent .

Si eso no funciona, puede agregar otro atributo que establezca maxHeight o maxHeight para el elemento de vista.


Las buenas noticias:

Puedo señalarle la versión exacta que cambió el comportamiento de RecyclerView: no es un cambio en 23.2.1 sino un cambio en 23.2.0 (febrero de 2016) . Más específicamente:

RecyclerView.LayoutManager ya no ignora algunas configuraciones de RecyclerView.LayoutParams, como MATCH_PARENT en la dirección de desplazamiento.

Nota: estas restricciones levantadas pueden causar un comportamiento inesperado en sus diseños. Asegúrese de especificar los parámetros de diseño correctos.

De hecho, si inicia las bibliotecas 23.2.0, verá el mismo comportamiento. Ese comportamiento se puede simplificar en su caso como:

Ahora, cuando tenga hijos de RecyclerView con android:layout_x="match_parent" , eso afectará al android:layout_x de RecyclerView android:layout_x , que no fue el caso en 23.1.1 y versiones anteriores.

Las malas noticias:

Incluso si estoy 99% seguro de que esta es la razón detrás de su problema, todavía no puedo ver un problema en su código. De hecho, he configurado un RecyclerView con su estructura XML (cambiando solo los parámetros de color / fondo), con un LinearLayoutManager y funciona como se espera en 23.2.1. Puedo compartir mi implementación si desea realizar una comprobación de validez.

Debería verificar la implementación / manipulación de su adaptador, incluso si está muy extendido.