RecyclerView 中带有 DataBinding 的 ConstraintLayout 宽度不正确
ConstraintLayout with DataBinding incorrect width in RecyclerView
我正在尝试使用新的 ConstraintLayout。我为我的 RecyclerView 行做了布局。它有 ConstraintLayout 作为宽度设置为 match_parent
的根元素,当我 运行 我的应用程序呈现时正如预期的那样
在我将数据绑定部分放入我的 XML 之前它运行良好,此后根元素是 layout
标签,它包装了 ConstraintLayout 并且它导致 ConstraintLayout 的行为发生一些不可预测的变化 - 它的宽度此后不会呈现为 match_parent
,它只占用显示宽度的一小部分,尽管它在 XML 中仍设置为 match_parent
。我也尝试将宽度设置为某个固定值,结果是一样的
我怀疑数据绑定处理器在构建过程中处理布局时会从 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) {
}
}
感谢 @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 会得到预期的结果
虽然我没有使用数据绑定,但我遇到了同样的问题。
事实证明这是约束布局中的错误并已在 beta5 中修复,因此如果您的视图膨胀代码是正确的,并且您仍然有此问题,请将您的依赖项升级到 com.android.support.constraint:constraint-layout:1.1.0-beta5
或更新版本应该修理它。它现在已经结束测试,所以你应该使用 1.1.0
.
我正在尝试使用新的 ConstraintLayout。我为我的 RecyclerView 行做了布局。它有 ConstraintLayout 作为宽度设置为 match_parent
的根元素,当我 运行 我的应用程序呈现时正如预期的那样
在我将数据绑定部分放入我的 XML 之前它运行良好,此后根元素是 layout
标签,它包装了 ConstraintLayout 并且它导致 ConstraintLayout 的行为发生一些不可预测的变化 - 它的宽度此后不会呈现为 match_parent
,它只占用显示宽度的一小部分,尽管它在 XML 中仍设置为 match_parent
。我也尝试将宽度设置为某个固定值,结果是一样的
我怀疑数据绑定处理器在构建过程中处理布局时会从 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) {
}
}
感谢 @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 会得到预期的结果
虽然我没有使用数据绑定,但我遇到了同样的问题。
事实证明这是约束布局中的错误并已在 beta5 中修复,因此如果您的视图膨胀代码是正确的,并且您仍然有此问题,请将您的依赖项升级到 com.android.support.constraint:constraint-layout:1.1.0-beta5
或更新版本应该修理它。它现在已经结束测试,所以你应该使用 1.1.0
.