4 votes

ConstraintLayout avec DataBinding largeur incorrecte dans RecyclerView

J'essaie de jouer avec le nouveau ConstraintLayout. J'ai créé la mise en page de la ligne de mon RecyclerView. L'élément racine est un ConstraintLayout dont la largeur est définie sur match_parent et lorsque j'exécute mon application, le rendu est conforme à ce qui était prévu.

correct width

Cela fonctionne bien jusqu'à ce que je mette une section de liaison de données dans mon XML et que l'élément Root soit dorénavant layout qui englobe le ConstraintLayout, ce qui entraîne un changement imprévisible du comportement du ConstraintLayout - sa largeur n'est désormais pas rendue comme suit match_parent il ne prend qu'une petite partie de la largeur d'affichage, bien qu'il soit toujours réglé sur match_parent en XML. J'ai également essayé de définir la largeur à une valeur fixe et le résultat est le même.

enter image description here

Je soupçonne que le processeur de liaison de données supprime en quelque sorte les attributs de ConstrainLayout lors du traitement des mises en page pendant le processus de construction. Existe-t-il un moyen de faire fonctionner les choses correctement ? Ma mise en page

<layout xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="android.view.View"/>
        <variable
            name="post"
            type=".entity.Post"/>
        <variable
            name="data"
            type=".entity.LinkPostData"/>
    </data>

    <android.support.constraint.ConstraintLayout
        android:id="@+id/constraintLayout"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="16dp">
        ....
    </android.support.constraint.ConstraintLayout>
</layout>

Et adaptateur :

class PostsAdapter(): RecyclerView.Adapter<PostsAdapter.PostItemViewHolder>() {

    private val posts: MutableList<Post> = ArrayList()

    fun setPosts(domains: List<Post>) {
        this.posts.clear()
        this.posts.addAll(domains)
        notifyDataSetChanged()
    }

    override fun getItemViewType(position: Int): Int {
        return super.getItemViewType(position)
    }

    override fun onBindViewHolder(holder: PostItemViewHolder?, position: Int) {
        val post = posts[position]

        holder?.binding?.post = post
        holder?.binding?.data = post.data as LinkPostData
        holder?.binding?.executePendingBindings()
    }

    override fun getItemCount() = this.posts.size

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): PostItemViewHolder {
        val binding = ItemPostBinding.inflate(LayoutInflater.from(parent?.context))
        return PostItemViewHolder(binding)
    }

    class PostItemViewHolder(val binding: ItemPostBinding): RecyclerView.ViewHolder(binding.root) {

    }
}

7voto

Oleg Osipenko Points 1717

Merci à @Xaver Kapeller J'ai réussi à trouver la vraie cause. C'était le code de mon adaptateur. Pour le faire fonctionner, j'ai dû changer onCreateViewHolder() comme suit :

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): PostItemViewHolder {
    val binding = ItemPostBinding.inflate(LayoutInflater.from(parent?.context), parent, false)
    return PostItemViewHolder(binding)
}

Fournir ViewGroup donne le résultat attendu

-1voto

Tim Castelijns Points 29568

Bien que je n'utilise pas de liaison de données, j'avais le même problème.

Il s'avère qu'il s'agissait d'un bogue dans la disposition des contraintes et qu'il a été corrigé dans la version bêta5. Donc, si votre code de gonflement de la vue est correct et que vous rencontrez toujours ce problème, mettez à jour votre dépendance vers com.android.support.constraint:constraint-layout:1.1.0-beta5 ou plus récent devrait le réparer. Il n'est plus en version bêta maintenant, donc vous devriez utiliser 1.1.0 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X