свойство родительской ширины не работает в RecyclerView

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Я попытался установить свойство match_parent width для TextView ViewHolder , но оно работает так же, как wrap_context.

 // recyclerview
<androidx.recyclerview.widget.RecyclerView
    android:id="@ id/maintainer_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
    app:listMaintainer="@{viewModel.maintainers}"/>

// viewHolder item
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@ id/maintainer_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:background="@color/color_black"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="maintainer_name" />
  

введите описание изображения здесь

Обновить

Спасибо @Mike M. потому что я использую привязку данных в ViewHolder и неправильно добавляю ее в адаптер в onCreateViewHolder методе, поэтому это вызывает эту проблему.

Комментарии:

1. Установите начальные и конечные ограничения для текстового представления и установите ширину в android:layout_width="0dp"

2. Если установить width равным 0dp, я больше не увижу TextView.

3. Вы уверены, что правильно раздуваете макет в своем Adapter ? Вам нужно передать ViewGroup параметр в onCreateViewHolder() качестве родительского в inflate() вызове. Если вы пройдете null по нему, вы получите поведение, которое вы наблюдаете.

Ответ №1:

Макеты ограничений не должны использоваться match_parent . Если я не ошибаюсь, вы должны получить предупреждение в IDE.

Способ сделать это — использовать 0dp и ограничить конец / начало или верх / низ соответствующими родительскими сторонами.

 <TextView
    android:layout_width="0dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintStart_toEndOf="parent" />
  

Я выделил только необходимые изменения и дополнения

Ответ №2:

Когда вы создаете дочерний элемент ConstraintLayout шириной match_parent, нет необходимости устанавливать горизонтальное ограничение (начало и конец). Если вы удалите строку app:layout_constraintStart_toStartOf="parent" из своего TextView, она будет отображаться именно так, как вы этого хотите.

Подводя итог, есть два способа сделать то, что вы хотите сделать. Я проиллюстрировал два подхода ниже:

  1. Установите ширину TextView на match_parent и исключите любые горизонтальные ограничения:

     <androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    
    <TextView
        android:id="@ id/maintainer_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:background="@color/color_black"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="maintainer_name" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
      

  1. Установите ширину TextView на 0dp и включите горизонтальные ограничения:

     <androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    
    <TextView
        android:id="@ id/maintainer_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:background="@color/color_black"
        android:textSize="24sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="maintainer_name" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>