代码之家  ›  专栏  ›  技术社区  ›  Luke Needham

使用自定义视图作为RecyclerView-constraint布局中的项无法处理具有匹配约束宽度的子项

  •  0
  • Luke Needham  · 技术社区  · 7 年前

    我有一个 RecyclerView ,其中项目视图是通过展开布局创建的 在自定义视图中 ,带有 ConstraintLayout

    wrap_content 它很好用。

    但是当我将第二个子视图设置为具有宽度时 0dp (“匹配约束”),奇怪的事情发生了。

    <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具有宽度时 包装内容 0dp ,一切都完了。

    此问题仅发生在第二个TextView上-第一个TextView可以具有宽度 包装内容 或 0dp 0dp ,会出现不同的问题:

    myTextView:wrap_内容,myTextView1:wrap_内容-无问题

    myTextView:0dp,myTextView1:包装内容-无问题

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

    有什么补救办法吗?

    3 回复  |  直到 7 年前
        1
  •  7
  •   Luke Needham    7 年前

    出现这个问题是因为我使用的是自定义视图,而不是膨胀布局。解决方案是以编程方式在中指定布局约束 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);
    }
    
        2
  •  0
  •   Mehul Kabaria    7 年前

    试试这个

    <?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"

        3
  •  0
  •   user10311058 user10311058    7 年前

    我测试了您的布局并重现了您的问题: 我的解决方案,希望能奏效: 在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_版本:

    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int type) {
                View itemView = layoutInflater.inflate(R.layout.recyclerview_item_layout, parent, false);
                return new ViewHolder(itemView);
            }
    

    然后可以将两个子视图的宽度都设置为 0dp

    提示:当您设置宽度以匹配\u约束或 0dp app:layout_constraintHorizontal_bias

    推荐文章