#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, она будет отображаться именно так, как вы этого хотите.
Подводя итог, есть два способа сделать то, что вы хотите сделать. Я проиллюстрировал два подхода ниже:
-
Установите ширину 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>
-
Установите ширину 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>