android GridLayoutManager — как сделать равный интервал, когда recyclerview ограничен левой и правой сторонами экрана

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

У меня есть GridLayout, который выглядит следующим образом:

введите описание изображения здесь

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

вот мой recyclerview:

   <RecyclerView
android:id="@ id/rv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:clipChildren="false"
android:clipToPadding="false"
android:splitMotionEvents="false"
tools:background="@color/green"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:descendantFocusability="blocksDescendants"
android:layout_marginTop="16dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:spanCount="3"
tools:listitem="@layout/grid_item"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" />
  

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

Ответ №1:

я понял это и дам вам несколько подсказок. gridlayoutmanager масштабирует элементы таким образом, чтобы они соответствовали всем элементам в соответствии с вашим количеством пролетов. итак, представьте, когда gridlayoutmanager берет ваш элемент, он говорит, как я могу растянуть этот элемент так, чтобы X их количество могло поместиться в строке?

лучший подход, который я нашел, — использовать ConstraintLayout . например:

  app:layout_constraintDimensionRatio="1:1" 
  

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

например.

 app:layout_constraintWidth_percent=".51"
app:layout_constraintHeight_percent=".63"
  

для меня процентный показатель, который я использовал для ImageView, поэтому он сохраняет соотношение при растяжении.

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

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

после того, как вы все это сделаете, ваши элементы будут плотно собраны вместе без пробелов. теперь используйте itemdecorator, чтобы добавить интервал, и он должен работать.