Центрирование элементов в RecyclerView, когда оно реализовано с помощью GridLayoutManager

У меня есть RecyclerView, реализованный с помощью GridLayoutManager.

В зависимости от того, сколько элементов находится в наборе данных, spanCount находится в диапазоне от 1 до 4. Ширина элемента изменяется в зависимости от spanCount. Если spancount равен 4 или выше, spanCount остается равным 4.

Если у меня есть 5 элементов, остается 1 элемент (4 элемента в 1 ряду, 1 элемент остается), расположенный в левой части экрана, в отдельной строке. Я хотел бы, чтобы это было по центру.

Я попытался программно установить левый край элемента и обернуть как recyclerView, так и отдельные элементы в LinearLayouts и установить гравитацию в центр, а также установить гравитацию recyclerView.

Пример XML элемента:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="horizontal"

    >


    <RelativeLayout
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:id="@+id/relative"
        /> 

</LinearLayout>

Пример RecyclerView XML

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal"
            >
           <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            />

        </LinearLayout>

Может ли кто-нибудь предложить решение или дать мне материал для работы.

Заранее спасибо.


person Micah Simmons    schedule 17.11.2015    source источник


Ответы (1)


Ответ на этот вопрос заключается в том, что когда вы устанавливаете spancount для GridLayoutManager, каждый элемент, независимо от того, насколько большим вы пытаетесь его сделать, он не будет расширяться в размерах, превышающих размеры, разрешенные для отдельного элемента. Этот разрешенный размер «поля» в элементе, а размер поля определяется общей высотой и шириной recyclerview по отношению к spancount, установленному в GridLayoutManager. Это также означает, что вы не можете использовать настройки гравитации, чтобы вытолкнуть элемент за пределы его «коробки».

Блок/ячейка элемента обычно рассчитывается следующим образом: если ширина recylerview равна 100dp, а spancount равен 2, каждый блок/ячейка элементов будет иметь ширину: width/spanCount. В этом случае каждое поле будет иметь ширину 50 dp (100 dp/spanCountOf2).

Чтобы элемент занимал полные 100 dp, а затем располагался по центру в пространстве 100 dp, элемент должен будет занимать 2 spancounts, т. е. если ширина равна 100 dp, а spancount равен 2, каждому элементу отводится 50 dp в width (1 из 2 доступных spancount), чтобы элемент занимал полные 100 dp, вам нужно сообщить gridLayoutManager, что элемент в позиции X занимает 2 spanCount вместо 1. Как только элемент занимает всю ширину, или количество промежутков, которые вы хотите, чтобы он занимал, его можно центрировать или изменить размер в пределах его вновь определенного поля (размером окна является ширина/высота ресайклера по отношению к его количеству промежутков).

Чтобы изменить количество диапазонов, занимаемых данным элементом, вызовите: setSpanSizeLookup() в GridLayoutManager. Затем определите положение элемента, для которого вы хотите изменить spanSize, и в операторе return метода setSpanSizeLookup() верните, сколько диапазонов вы хотите использовать:

 gridlayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    if (position == 1) {
                        return 4; // the item in position now takes up 4 spans
                    }
                    return 1;
                }
            });
        }

Изменяя spanCount элементов, вы можете использовать настройки гравитации, чтобы центрировать элемент в середине строки, если этот элемент занимает общий spancount для каждой строки.

Тем не менее, вы можете обнаружить, что вам также нужно использовать альтернативные макеты в адаптере для ваших элементов, чтобы центрировать элементы. Таким образом, возможно, вам придется смешивать и сопоставлять настройки с разными счетчиками диапазонов и использовать разные макеты с помощью метода getItemViewType() в recyclerAdapter.

person Micah Simmons    schedule 22.11.2015
comment
Хорошо объяснил! - person NightFury; 20.12.2016