В моем приложении у меня есть RecyclerView, отображающий продукты с изображением и названием. Макет использует ConstraintLayout (версия 2.0.0-alpha5), а ширина TextView зависит от ширины изображения.
Я хочу, чтобы заголовок был singleLine, поэтому я объявил maxLines = 1 (я также использовал атрибут singleLine, чтобы увидеть, если это было проблемой), и я ожидал, что будет отображено первое слово, однако оно (очевидно) случайным образом показывает только первая буква.
Это мой макет:
<?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="wrap_content"
android:layout_height="match_parent"
android:layout_margin="4dp">
<androidx.cardview.widget.CardView
android:id="@+id/product_img_card"
android:layout_width="wrap_content"
android:layout_height="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/product_designation">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/product_img_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<ImageView
android:id="@+id/product_img"
android:layout_width="0dp"
android:layout_height="match_parent"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="V,1:1"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:src="@drawable/img_product_sample"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<TextView
android:id="@+id/product_designation"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textSize="9sp"
android:fontFamily="sans-serif-smallcaps"
android:background="#FF0"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/product_img_card"
app:layout_constraintStart_toStartOf="@+id/product_img_card"
app:layout_constraintTop_toBottomOf="@+id/product_img_card"
tools:text="COUTEAU PLAT 16CM BOIS"
android:maxLines="1"/>
Мой метод адаптера RecyclerView onBindViewHolder выглядит следующим образом:
override fun onBindViewHolder(holder: ProductHolder, position: Int) {
val product = listProducts[holder.layoutPosition]
holder.designation.text = product.designation
Log.d(
"MyProblem",
"Product.designation=[${product.designation}], textview content=[${holder.designation.text}]"
)
val photo = PhotosUtils.getFirstroductPicture(holder.itemView.context, product.codeArticle)
if (photo != null) {
val uri = Uri.fromFile(photo)
GlideApp.with(holder.img)
.load(uri)
.error(R.drawable.ic_broken_image_black_24dp)
.signature { photo.length().toString() }
.into(holder.img)
} else {
GlideApp.with(holder.img)
.load(R.drawable.ic_broken_image_black_24dp)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
//.signature { System.currentTimeMillis() }
.into(holder.img)
}
}
Изображение отображается правильно, значение product.designation и значение textview.text являются правильными (например, «JERRICAN PLASTIQUE 5L»), но иногда в TextView отображается только первая буква.
Цвет фона отображает правильную ширину.
На скриншоте ниже я сначала вижу слово целиком об одном продукте, затем прокручиваю в RecyclerView и возвращаюсь к этому продукту, который был правильно отображен, и он снова показывал только первую букву.
Есть идеи, почему это происходит?