在RecyclerView中使用DataBinding的ConstraintLayout不正确的宽度

时间:2016-07-10 10:49:08

标签: android android-databinding android-constraintlayout

我正在尝试使用新的ConstraintLayout。我为RecyclerView的行做了布局。它将ConstraintLayout作为根元素,其宽度设置为match_parent,当我运行我的应用程序时,它会按预期呈现

correct width

它直到我将数据绑定部分放入我的XML并且此后根元素是layout标记包装ConstraintLayout并且它导致ConstraintLayout的行为发生一些不可预测的变化 - 它的宽度从此不会呈现为match_parent,它只占显示宽度的一小部分,尽管它仍然在XML中设置为match_parent。我也尝试将宽度设置为某个固定值,结果是相同的

enter image description here

我怀疑数据绑定处理器有点在构建过程中处理布局时从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) {

    }
}

2 个答案:

答案 0 :(得分:8)

感谢@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给出预期结果

答案 1 :(得分:-1)

虽然我没有使用数据绑定,但我遇到了同样的问题。

原来这是约束布局中的一个错误,并在beta5中得到修复,因此如果您的视图膨胀代码是正确的,并且您仍然遇到此问题,请将您的依赖关系升级到com.android.support.constraint:constraint-layout:1.1.0-beta5或更新应修复它。它现在已经过时了,所以你应该使用1.1.0