我有一个RecyclerView
,其中的项目视图是通过在自定义视图内将布局放大来创建的,其布局以ConstraintLayout
为根。
当我将子视图的宽度设置为wrap_content
时,效果很好。
但是当我将第二个子视图设置为宽度0dp
(“ match_constraint”)时,会发生奇怪的事情。
这是我的物品布局:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/myTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="TextView"
/>
<TextView
android:id="@+id/myTextView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textColor="@color/text_color_dark_primary"
android:textSize="15sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/myTextView"
tools:text="TextView"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
当myTextView2的宽度为wrap_content
时,一切都很好。但是当我把它做成0dp
时,所有的地狱都变得松散了。
该问题仅发生在第二个TextView上-第一个TextView的宽度可以为wrap_content
或0dp
,并且两者都可以正常工作。但是,当第二个TextView的宽度为0dp
时,就会出现不同的问题:
myTextView:wrap_content,myTextView1:wrap_content-没问题
myTextView:0dp,myTextView1:wrap_content-没问题
myTextView:0dp,myTextView1:0dp-无项目显示,无限滚动
myTextView:wrap_content,myTextView1:0dp-myTextView在屏幕左侧显示为一小列,其余宽度为空白
有任何修复程序吗?
答案 0 :(得分:0)
尝试
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/myTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="TextView" />
</android.support.constraint.ConstraintLayout>
您可能忘记添加app:layout_constraintBottom_toBottomOf="parent"
答案 1 :(得分:0)
我测试了您的布局并重现了您的问题:
我的解决方案,希望它能起作用:
当您在onCreateViewHolder中增加recyclerview项布局时
将null
更改为parent
作为第二个参数
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RvViewHolder {
val rootView = inflater.inflate(R.layout.item_temp_recyclerview, parent, false)
return RvViewHolder(rootView)
}
java_version:
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int type) {
View itemView = layoutInflater.inflate(R.layout.recyclerview_item_layout, parent, false);
return new ViewHolder(itemView);
}
然后您可以将两个子视图的宽度都设置为0dp
提示:将宽度设置为match_constraint或0dp
时,不需要app:layout_constraintHorizontal_bias
答案 2 :(得分:0)
出现此问题是因为我使用的是自定义视图,而不是放大布局。解决方案是在onCreateViewHolder
中以编程方式指定布局约束,如下所述:https://stackoverflow.com/a/48123513/6007104
特别是:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// no need for a LayoutInflater instance—
// the custom view inflates itself
CustomView itemView = new CustomView(parent.getContext());
// manually set the CustomView's size - this is what I was missing
itemView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
));
return new ViewHolder(itemView);
}