Изменить макет GridLayoutManager - PullRequest
0 голосов
/ 10 апреля 2020

Чего я хочу достичь:

enter image description here

Что я сделал:

У меня есть кнопка от 1 до 5 столбцов, когда пользователь cli c по номеру колонки он хочет, раскладка меняется, но все карточки приклеены друг к другу. Пока это то, что я смог сделать: https://imgur.com/a/CL4FZhY

Мой предмет :

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/video_preview"
        android:layout_width="match_parent"
        android:layout_height="194dp"
        android:scaleType="centerCrop"
        tools:src="@drawable/img_error_v1"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp">
        <TextView
            android:id="@+id/video_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?attr/textAppearanceHeadline6"
            android:maxLines="1"
            tools:text="This is a really really really really really really really really really really really long title"
            />
        <TextView
            android:id="@+id/video_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:maxLines="1"
            android:textAppearance="?attr/textAppearanceBody2"
            android:textColor="?android:attr/textColorSecondary"
            tools:text="This is the URL for now"
            />
    </LinearLayout>
</LinearLayout>

Мой вопрос:

Как я могу добиться такого рода изменений? Я прочитал о ItemDecoration, но не думаю, что смогу изменить layout_height моего предмета. Нужно ли создавать один макет для каждого экрана столбца?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Я не знаю, правильное ли это решение, но эта статья поможет мне изменить расположение моего представления в зависимости от количества столбцов.

  • Недостатком является что мне нужно создать разный макет для каждого макета столбца, который я хочу отобразить.
  • Преимущество в том, что у меня больше контроля над элементом каждого макета, и я могу изменить размер текста или что-то еще.

Поскольку это немного долго, я создал репо , чтобы показать, как я это сделал.

Могут быть некоторые улучшения, чтобы оценить любую помощь:)

0 голосов
/ 11 апреля 2020

Вы можете добиться этого, динамически изменяя поля root элемента списка, это необходимо сделать в адаптере onBindViewHolder() function

GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) holder.card.getLayoutParams();
            if (position % 2 == 0) {
                params.setMargins(dpTopixel(20), dpTopixel(10), dpTopixel(10), dpTopixel(5));
            } else {
                params.setMargins(dpTopixel(10), dpTopixel(10), dpTopixel(20), dpTopixel(5));
            }
            holder.card.setLayoutParams(params);

Здесь есть функция для преобразования пикселя в dp

private int dpTopixel(int dp) {
    float dip = (float) dp;
    Resources r = context.getResources();
    float px = TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP,
            dip,
            r.getDisplayMetrics()
    );
    return (int) px;
}

Если вы используете один и тот же адаптер для обоих экранов, вы можете отправить флаг с конструктором адаптера, чтобы заблокировать этот код

...