【问题标题】:Why layout_width of androidx.RecyclerView could affect its layout_constrainedHeight behaviour?为什么 androidx.RecyclerView 的 layout_width 会影响其 layout_constrainedHeight 行为?
【发布时间】:2021-06-06 23:33:01
【问题描述】:

原始问题:为什么androidx.RecyclerView 中的文本更新后layout_constrainedHeight 不起作用

更新问题:为什么androidx.RecyclerView 中的layout_width 会影响其layout_constrainedHeight 行为?

老问题内容:


在我的previous question 的扩展中,layout_constrainedHeight 据说正在动态包装recyclerView,但是我遇到了另一个奇怪的问题,在回收器视图项中更新文本后,它只是扩展到最大,我没有知道为什么。

layout_constrainedHeight 是必需的,因为我需要执行以下操作:

当列表很短时:RecyclerView下方的粘贴按钮

当列表很长时:屏幕底部的按钮和RecyclerView可以正确滚动到列表末尾

我遵循了这个布局:

记下 t2 的 textView id,当我将文本添加到 TextView android:text="Block X XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX" recyclerView 时,它会正确地在下方换行按钮,而不是在应该换行的地方展开。感谢您的帮助。

如果您需要完整的源代码,可以克隆here,因为我不知道根源在哪里。谢谢。只需克隆、同步和运行。你应该看到问题。提前致谢。


新问题内容:

编辑/更新:

我发现只需将RecyclerView 中的layout_widthmatch_constraint(0dp) 更改为match_parent 即可。但为什么会这样。谁能解释一下?这是一个错误还是什么?


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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="match_parent">

    <View
        android:id="@+id/divider_key_in_address_default"
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:background="@color/colorSecondaryGray"
        app:layout_constraintBottom_toTopOf="@id/rv_user_address"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0"
        app:layout_constraintVertical_chainStyle="packed" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_user_address"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="15dp"
        android:layout_marginEnd="20dp"
        app:layout_constrainedHeight="true"
        app:layout_constraintBottom_toTopOf="@id/ll_add_new_address"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/divider_key_in_address_default"
        app:layout_constraintVertical_bias="0.0"
        app:layout_constraintVertical_chainStyle="packed"
        tools:itemCount="10" />

    <LinearLayout
        android:id="@+id/ll_add_new_address"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="20dp"
        android:layout_marginBottom="20dp"
        android:gravity="center"
        android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/rv_user_address"
        app:layout_constraintVertical_bias="0.0"
        app:layout_constraintVertical_chainStyle="packed">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="5dp"
            android:src="@drawable/ic_add" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Block X, XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX" />

        <!--        style="@style/TextViewBlue"-->

    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

这只是回收站视图item_simple.xml的项目布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp">

    <TextView
        android:id="@+id/t1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="address_additional_address_title"
        android:textSize="14sp"
        app:layout_constraintBottom_toTopOf="@id/ll"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0"
        app:layout_constraintVertical_chainStyle="packed" />

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/t1">

        <RadioButton
            android:id="@+id/r"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_marginVertical="15dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/t2"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0" />

        <TextView
            android:id="@+id/t2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:padding="20dp"
            android:text="Block X XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/iv_edit_address"
            app:layout_constraintStart_toEndOf="@id/r"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/iv_edit_address"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_marginTop="5dp"
            android:padding="15dp"
            android:tint="@color/colorOrange"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@id/t2"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0"
            app:srcCompat="@drawable/ic_edit" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

我的 gradle.build


    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.0"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'

【问题讨论】:

    标签: android android-layout android-recyclerview android-constraintlayout androidx


    【解决方案1】:

    您应该编辑activity_main.xml

    代码对我有用,正如您在下面所期望的那样

    <?xml version="1.0" encoding="utf-8"?>
    <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="match_parent">
    
        <View
            android:id="@+id/divider_key_in_address_default"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:background="@color/colorSecondaryGray"
            app:layout_constraintBottom_toTopOf="@id/rv_user_address"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0"
            app:layout_constraintVertical_chainStyle="packed" />
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_user_address"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="20dp"
            android:layout_marginTop="15dp"
            android:layout_marginEnd="20dp"
            app:layout_constraintBottom_toTopOf="@id/ll_add_new_address"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/divider_key_in_address_default"
            tools:itemCount="10" />
    
        <LinearLayout
            android:id="@+id/ll_add_new_address"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:layout_marginStart="20dp"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="20dp"
            android:layout_marginBottom="20dp"
            android:gravity="center"
            android:orientation="horizontal"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/rv_user_address">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="5dp"
                android:src="@drawable/ic_add" />
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Block X, XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX" />
    
            <!--        style="@style/TextViewBlue"-->
    
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    【讨论】:

    • 您的意思是删除 constrainedHeight 吗?这将导致另一个问题,这是我在问题开头提到的上一个问题。
    • 当list/recyclerView较长时,底部的按钮会离开屏幕
    • 好的,明白了。我会根据你说的解决这个问题
    【解决方案2】:

    PS。抱歉删除任何边距

    它确实有效!

    <?xml version="1.0" encoding="utf-8"?>
    <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="match_parent">
    
        <View
            android:id="@+id/divider_key_in_address_default"
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:background="@color/colorSecondaryGray"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_user_address"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintVertical_chainStyle="packed"
            app:layout_constraintVertical_bias="0"
            app:layout_constrainedHeight="true"
            app:layout_constraintBottom_toTopOf="@id/ll_add_new_address"
            app:layout_constraintTop_toTopOf="parent"
            tools:itemCount="100" />
    
        <LinearLayout
            android:id="@+id/ll_add_new_address"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:gravity="center"
            android:orientation="horizontal"
            app:layout_constraintTop_toBottomOf="@+id/rv_user_address"
            app:layout_constraintBottom_toBottomOf="parent">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="5dp"
                android:src="@drawable/ic_add" />
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Block X, XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX" />
    
            <!--        style="@style/TextViewBlue"-->
    
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    【讨论】:

    • 可以详细解释您的答案吗?它使哪个部分起作用?是否删除边距使其工作?
    • 你能说出准确的答案,即将android:layout_width改为match_parent
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2022-11-06
    相关资源
    最近更新 更多