Anteriormente, estoy usando la siguiente edad de apoyo a las bibliotecas «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. He aquí cómo mi RecyclerView parece

Reciclador de vista de elemento de llenar todo el reciclador de vista de la altura después de la actualización de la biblioteca de soporte de

Ahora, quiero migrar a «23.2.1», debido a algunas correcciones de errores de hecho.

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 RecyclerView elementos, parecen llenar el RecyclerView toda la altura.

Reciclador de vista de elemento de llenar todo el reciclador de vista de la altura después de la actualización de la biblioteca de soporte de

Reciclador de vista de elemento de llenar todo el reciclador de vista de la altura después de la actualización de la biblioteca de soporte de

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

Lo que realmente rompecabezas de mí es que, a pesar de que estoy usando "wrap_content" en mi reciclador de vista de diseño del elemento, no funciona como se esperaba.

Yo no uso ningún administrador de diseño personalizado para mi RecyclerView.

De http://developer.android.com/tools/support-library/index.html, me doy cuenta de 23.2.1 hace un buen número de cambios en RecyclerView este tiempo.

  • Corregidos los bugs relacionados con diversos medida de las especificaciones técnicas, los métodos. (Problema 201856)
  • Reducido el bloqueo período en el que RecyclerView no permite que el adaptador de cambios, mientras que el cálculo de un diseño o de desplazamiento. (Problema 202046)
  • Se ha corregido un error cuando se llama a notifyItemChanged() en un elemento que está fuera de la vista. (Problema 202136)
  • Se ha corregido un error que se produce cuando RecyclerView.LayoutManager agrega y elimina una vista en la misma medida que pase. (Problema 193958)

Lo que sospecho que la mayoría de es https://code.google.com/p/android/issues/detail?id=201856 , como se trata de cambiar diversos medida de las especificaciones técnicas, los métodos

Hasta ahora, intente reproducir el problema con un simple RecyclerView proyecto, con 23.2.1 pero no! No tiene «llena el RecyclerView toda la altura del problema». Mi conjetura es que, mi proyecto sencillo, no simular el complejo diseño de la estructura de mi proyecto de producción. Mi proyecto de producción es tener el siguiente diseño

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

Después de la depuración de unas horas, estoy todavía no puede encontrar la causa raíz de este problema, alguna sugerencia?

Gracias.

Lo que yo había tratado de

Yo había tratado de cambiar RecyclerView

de

<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, al realizar el desplazamiento, la cosa no funciona como se esperaba : https://www.youtube.com/watch?v=U2EChFn6WkI

ACTUALIZACIÓN: finalmente averiguar la causa raíz

Es error, a mi lado! Ya que necesito tener diferentes margen de la última fila del elemento, aquí está mi adaptador de código.

@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);
    }

Por desgracia, lastLayoutParams y normalLayoutParams se inicializa 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
    );

Utilizando LinearLayout.LayoutParams.WRAP_CONTENT resolver el problema.

  • ¿Establece el minHeight o maxHeight o su punto de vista?
  • Pero, no sé cuál debe ser el valor de minHeight y maxHeight.
  • Estoy frente a esta así.
  • He arreglado el problema por el cambio de diseño de la altura a la «wrap_content» de «match_parent»
  • Como u puede ver mi archivo de diseño, también estoy usando wrap_content. Alguna idea de por qué sucedió?
  • parece una dup de stackoverflow.com/questions/35638638/…, pero, aparentemente, no?
  • Puedes intentar sacar la stateListAnimator? He tenido problemas con RecyclerView y Animaciones antes de cuando se desplaza.
  • De hecho, he configurado un RecyclerView con su estructura XML (cambiando sólo el color/fondo de parámetros), con la Actividad -> ViewPager -> Fragmento -> RecyclerView y funciona como se esperaba en 23.2.1. Conecte el adaptador de código
  • ¿te importa compartir tu código? Por lo que puedo comparar contra el mío. Gracias.
  • El problema es casi seguro que ver con cómo se está configurando la interfaz de usuario en su onBindViewHolder función. Es por eso que el error aparece cuando se desplaza hacia abajo y, a continuación, el error palos cuando se desplaza hacia arriba. Comparte tu Adaptador de código para que podamos determinar el error.
  • Gracias @Knossos se había hecho una predicción correcta 🙂
  • Yan Cheng, Gracias por tan detallada pregunta. Por CIERTO, es una muy buena aplicación. Es opensource, por casualidad?

7 Comentarios

  1. 17

    Actualización

    Parece que la actualización del LayoutParam para su View en su Adapter.

    Es posible decir esto porque su interfaz de usuario aparece absolutamente bien hasta que comience a desplazar. Esto significa que el XML es el correcto tal como se define en el fichero XML de diseño.

    El hecho de que los cambios después de que comience el desplazamiento, significa que hay un error de lógica en su onBindViewHolder aplicación. Es por eso que el error aparece cuando se desplaza hacia abajo y, a continuación, el error palos cuando se desplaza hacia arriba.

    Respuesta anterior

    El problema es que el divisor ha ido rogue:

    <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, establece que:

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

    Asegúrese de cambiar tanto de ellos!

    • Yo había cambiado tanto a 30dp. Pero, no ayuda mucho – i.imgur.com/hl4mKGY.png
    • A mí me parece que va a cambiar la LayoutParams en su RecyclerView Adaptador. Se puede comprobar eso? Tal vez publicar el código. Si funciona en el inicio, luego el XML está bien. El problema está en la dinámica de los cambios en el Adaptador.
    • Puedes publicar tu Adaptador?
    • Estás en lo correcto. Su sugerencia gatillo de mí para volver a verificar el adaptador de código cuidadosamente. Me cambian el LayoutParams de forma dinámica. Gracias.
    • Me alegra ver que has encontrado.
    • Aunque la sugerencia en los comentarios era correcta, la respuesta se encuentra justo ahora no es la respuesta correcta a la OP de la pregunta. ¿Te importaría añadir tu sugerencia en la respuesta original para el futuro de la legibilidad?
    • Absolutamente
    • Mi problema se me fue la creación de la «fila» diseño de los padres a match_parent, cambiando a wrap_content solucionar el problema.

  2. 10

    He tenido un problema similar. Es endend siendo que el reciclador no era el problema. Compruebe que su CardView elemento mediciones de traducir a 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ás usando CardView, asegúrese de que el elemento que utilizan en su Adaptador para la vista tiene android:layout_height="wrap_content" y no match_parent.

    Si eso no funciona, usted puede añadir otro valor de atributo de la minHeight o maxHeight para el elemento de vista.

    • Si usted mira buy_portfolio_card_row_layout.xml (que es el archivo de diseño para el reciclado de vista de elemento) en gist.github.com/yccheok/241a0d38d56305a1be24d09b54eb1600 , usted se dará cuenta de que yo ya estoy usando wrap_content de altura.
    • ¿Establece el minHeight o maxHeight o su punto de vista?
    • Puedo confirmar que este era el problema para mí también, que me encontré ayer a la derecha
    • ¿Tienes alguna captura de pantalla para describir el problema? Con más de descripción del problema, pronto pudiéramos averiguar la causa del problema. Gracias.
    • Tengo un mismo problema según se menciona en la parte superior. El uso de lin 23.2.1 llenar todos los puertos,he puesto a punto la altura match_parent a wrap_content. Su trabajo para mí
  3. 8

    La buena noticia:

    Me puede señalar que la versión exacta que cambió RecyclerView del comportamiento: no es un cambio en 23.2.1 sino más bien un cambio en 23.2.0 (febrero de 2016). Más específicamente:

    RecyclerView.LayoutManager ya no pasa por alto algunos de
    RecyclerView.LayoutParams configuración, tales como MATCH_PARENT en el desplazamiento
    dirección.

    Nota: Estos levantó las restricciones puede provocar un comportamiento inesperado en sus diseños. Asegúrese de especificar el diseño correcto de los parámetros.

    De hecho, si el fuego de la 23.2.0 de las bibliotecas, se verá el comportamiento de la misma. Que el comportamiento puede ser simplificado en su caso, como:

    Ahora, cuando usted tiene RecyclerView niños con android:layout_x="match_parent", que afectará a RecyclerView del android:layout_x, que no era el caso en 23.1.1 y versiones anteriores.

    La mala noticia:

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

    Usted debe comprobar la implementación del adaptador/manipulación incluso si está muy extendido.

    • Este fue, de hecho, la razón detrás de mi problema.
  4. 4

    Para solucionar este bug row_layout debe tener la altura fijo o wrap_content! También he tenido este problema y acabo de darme cuenta de que la altura de row_layout fue match_parent.

  5. 3

    La altura de la papelera de vista debe ser «wrap_content» solamente. La papelera de vista de la altura del mango 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" />
  6. 2

    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 el diseño de elemento que ha layout_height=»match_parent». Usted debe cambiar tanto a wrap_content.

  7. 1

    Acaba de hacer row_layout altura a wrap_content
    por lo que sólo tendrá fila altura real de espacio para todos los elementos.

Dejar respuesta

Please enter your comment!
Please enter your name here