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 anotifyItemChanged()
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.