Центрирование элементов в 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> 

Пример XML RecyclerView

  <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> 

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

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

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

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

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

Чтобы изменить количество пройденных позиций, вызовите: 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.