18

私は新しい ConstraintLayout をいじろうとしています。そして、RecyclerView の行のレイアウトを作成しました。幅が設定されているルート要素として ConstraintLayout がありmatch_parent、アプリを実行すると期待どおりにレンダリングされます

正しい幅

XMLにデータバインディングセクションを配置し、ルート要素layoutがConstraintLayoutをラップするタグになるまではうまく機能し、ConstraintLayoutの動作に予測できない変化が生じmatch_parentます.ただしmatch_parent、XML ではまだ に設定されています。また、幅を固定値に設定しようとしましたが、結果は同じでした

ここに画像の説明を入力

ビルド プロセス中にレイアウトを処理するときに、Data Binding プロセッサが ConstrainLayout から属性を少し取り除くのではないかと思います。物事を正しく機能させる方法はありますか? 私のレイアウト

<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>

そしてアダプター:

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) {

    }
}
4

2 に答える 2

38

@Xaver Kapellerのおかげで、本当の原因を突き止めることができました。そして、それは私のアダプターコードでした。onCreateViewHolder()それを機能させるには、次のようにメソッドを変更する必要がありました。

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

ViewGroup を提供すると、期待される結果が得られます

于 2016-07-11T09:31:56.557 に答える