9

У меня есть 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> 

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

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

ответ

9

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

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

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

Чтобы изменить количество пройденных объектов, вызовите: setSpanSizeLookup() в GridLayoutManager. Затем определить позицию элемента, который вы хотите изменить spanSize из и в обратном утверждении метода 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.

+1

Хорошо объяснено! – NightFury

Смежные вопросы