Android: Сделайте так, чтобы ширина текстового представления соответствовала изображению в горизонтальном режиме просмотра

#java #android #android-recyclerview

Вопрос:

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

Это xml-файл для элемента представления переработчика:

 <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<androidx.cardview.widget.CardView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp"
    app:cardElevation="0dp">


        <FrameLayout
            android:id="@ id/media_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

            <ImageView
                android:id="@ id/topimage"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"
                android:cropToPadding="true"
                android:paddingStart="8dp"
                android:paddingEnd="8dp"
                android:scaleType="fitXY" />



        <TextView
            android:id="@ id/title"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/topImage"
            android:padding="2dp"
            android:text="@string/placeholder_name"
            android:textColor="@android:color/black"
            android:textSize="16sp"
            android:layout_marginTop="5dp"/>

        <TextView
            android:id="@ id/subtitle"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/title"
            android:padding="2dp"
            android:text="@string/placeholder_details"
            android:textColor="@android:color/black"
            android:textSize="15sp"
            android:layout_marginBottom="10dp" />

            </RelativeLayout>
        </FrameLayout>


</androidx.cardview.widget.CardView>


</LinearLayout>
 

Кроме того, в адаптере просмотра переработчика я устанавливаю соотношение сторон ширины/высоты изображения 5:7, как это:

     double widthDouble = (Resources.getSystem().getDisplayMetrics().widthPixels / 2) * 0.9;
    int width = (int) widthDouble;
    int height = (int) (width * 0.7);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(width, height);
    viewHolder.topImage.setLayoutParams(lp);
    viewHolder.topImage.setScaleType(ImageView.ScaleType.FIT_CENTER);
 

Как я могу изменить это, чтобы элемент представления recycler был шириной изображения и чтобы текст был помещен под изображение?

PS: Я использую Java.

Ответ №1:

Вы можете сделать свой TetxView многострочным с помощью

 android: singleline = "false"

 

а затем используйте свойство «максимальное количество строк», чтобы установить максимальное количество разрешенных строк.

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

1. Спасибо, но даже с этим дополнением элемент RecyclerView имеет ширину полного текста, а не ширину изображения. Мне нужно, чтобы он был шириной изображения и при необходимости имел текстовую обертку.

2. Я вижу, что вы используете Относительную компоновку. Вы можете облегчить свою жизнь, используя макет ограничений. Если бы я был на вашем месте, в TextView попробуйте использовать: ‘layout_constraintEnd_toEndOf=»yourImageViewIdHere» и ‘layout_constraintStart_toStartOf=»yourImageViewIdHere». (После перехода на макет ограничений) Вы можете проверить, как его использовать здесь: developer.android.com/training/constraint-layout