将自定义视图用作RecyclerView中的项目-约束布局无法处理约束宽度匹配的子项

时间:2019-02-08 12:51:51

标签: android android-recyclerview android-constraintlayout

我有一个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_content0dp,并且两者都可以正常工作。但是,当第二个TextView的宽度为0dp时,就会出现不同的问题:

myTextView:wrap_content,myTextView1:wrap_content-没问题

myTextView:0dp,myTextView1:wrap_content-没问题

myTextView:0dp,myTextView1:0dp-无项目显示,无限滚动

myTextView:wrap_content,myTextView1:0dp-myTextView在屏幕左侧显示为一小列,其余宽度为空白

有任何修复程序吗?

3 个答案:

答案 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);
}