Выравнивание по центру элементов в Gridview

Я делаю игру на Android Studio и имею проблему с компонентом Grid View. Я не могу выровнять объекты внутри Grid View, как После изображения. Я пробую несколько способов как android:stretchMode или android:layout_centerHorizontal, но это не помогает. Вот мой XML-код:

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="@android:color/holo_orange_light"
        android:layout_weight="8"
        android:layout_gravity="center">

        <GridView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="10px"
            android:id="@+id/gridAnswersChar"
            android:numColumns="8"
            android:gravity="center">
        </GridView>

</RelativeLayout>

До:

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

После:

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

Ответ 1

Надеюсь, это не строгое требование для вас, что вы используете GridView, поскольку я считаю, что то, что вы ищете, по существу невозможно. Однако, если вы захотите использовать RecyclerView вместо этого, у меня есть решение для вас.

В этом решении будет использоваться FlexboxLayoutManager, часть проекта FlexboxLayout Google https://github.com/google/flexbox-layout

Полный код для моего решения можно увидеть здесь: https://gist.github.com/zizibaloob/0c44bfe59b371b5ae0bd2edcb4a7e592

Я расскажу о важных битках здесь. Во-первых, установка FlexboxLayoutManager в MainActivity.onCreate():

FlexboxLayoutManager manager = new FlexboxLayoutManager(this, FlexDirection.ROW);
manager.setJustifyContent(JustifyContent.CENTER);

RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
recycler.setLayoutManager(manager);

Когда мы создаем диспетчер компоновки, мы передаем FlexDirection.ROW, чтобы сообщить нам, что мы хотим, чтобы наши объекты выходили горизонтально (т.е. заполняем строку, а затем переходим к следующей строке, а не заполняем столбец, а затем течет к следующему столбцу).

Затем мы вызываем setJustifyContent() с помощью JustifyContent.CENTER, чтобы сообщить менеджеру, что мы хотим, чтобы частично заполненные строки были центрированы.

Второй важный бит - это способ, которым мы имитируем поведение GridView и его способность иметь заданное количество столбцов. Этот код находится в MyAdapter.onCreateViewHolder():

ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) itemView.getLayoutParams();
layoutParams.width = (parent.getWidth() / 4) - layoutParams.leftMargin - layoutParams.rightMargin;
itemView.setLayoutParams(layoutParams);

Ключ здесь (parent.getWidth() / 4), который дает каждому элементу вид одной четверти доступной ширины. Если вам нужно другое количество столбцов, просто измените 4 на 8 и т.д.

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

Поместите все это вместе, и вы получите приложение, которое выглядит так:

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

Ответ 2

Легкий и лучший способ выравнивания изображений и контента в центре - использовать гравитацию как центр в файле item_layout, а не в качестве родителя вашего grid-view.