Как централизовать последнюю неровную строку в GridView в Android?

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

Мой GridView код:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/grid_view"
    android:layout_width="fill_parent"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp"
    android:layout_height="fill_parent"
    android:numColumns="auto_fit"
    android:columnWidth="70dp"
    android:horizontalSpacing="10dp"
    android:verticalSpacing="20dp"
    android:gravity="center"
    android:stretchMode="spacingWidthUniform" >  

</GridView>

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

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


person Hussain Akhtar Wahid 'Ghouri'    schedule 03.10.2013    source источник
comment
Оберните текущий адаптер, который вы установили на GridView, другим адаптером, который будет вставлять некоторые дополнительные фиктивные элементы (при необходимости), чтобы ваши последние элементы были центрированы.   -  person user    schedule 03.10.2013
comment
@Luksprog: но ни один из столбцов не зависит от размера экрана, как я могу рассчитать, сколько еще элементов нужно добавить?   -  person Hussain Akhtar Wahid 'Ghouri'    schedule 03.10.2013
comment
Я думаю, вы могли бы использовать ViewTreeObserver и посмотреть, сколько столбцов использует GridView (getNumColumns()), а затем вызвать изменение адаптера (при необходимости добавить элементы) на основе этого значения. Будьте осторожны, чтобы не попасть в бесконечный цикл.   -  person user    schedule 03.10.2013
comment
@HussainAkhtarWahid'Ghouri': Вы нашли идеальное решение для этого? Мне также нужно реализовать такой же тип макета в моем проекте. Можете ли вы поделиться со мной своим кодом макета? Спасибо   -  person YuDroid    schedule 06.06.2014
comment
@YuDroid: у меня было это статическое требование, поэтому я выбрал Table View, у меня работает   -  person Hussain Akhtar Wahid 'Ghouri'    schedule 06.06.2014
comment
Хм, мне нужно реализовать это динамически. Но не могу найти отправную точку для этого. Если у вас есть мысли по этому поводу, было бы здорово, если бы вы могли поделиться. Спасибо за ответ.   -  person YuDroid    schedule 06.06.2014
comment
если вы используете табличное представление, вы также можете динамически использовать строки   -  person Hussain Akhtar Wahid 'Ghouri'    schedule 06.06.2014
comment
Ok. Дай мне попробовать. Спасибо   -  person YuDroid    schedule 06.06.2014
comment
Вы получили решение этой проблемы?   -  person Pavan Bilagi    schedule 17.07.2016


Ответы (4)


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

person Chen Hao    schedule 31.01.2015
comment
если вы используете два представления сетки, то, я думаю, табличное представление будет более удобным - person Hussain Akhtar Wahid 'Ghouri'; 09.02.2015

вы можете попробовать использовать невидимые элементы, это не самое эффективное решение, но простое, вы можете поместить два элемента, один в начале, один в конце строки и сделать их невидимыми

person obed andres gonzalez velez    schedule 21.07.2016
comment
это должно быть отклонено. это все равно не исправит это, если вы 1 отсутствуете в своем ряду, он не будет в центре, а будет заменен невидимым блоком. - person ralphgabb; 24.04.2019

Для тех, кто все еще ищет решение для этого, вот мой вариант, создайте TableLayout и, и для каждого TableRow установите его вес равным android:weightSum="4" и не забудьте добавить android:gravity="center"

Полный код см. в этом gist.

person ralphgabb    schedule 23.04.2019

Вы можете центрировать строку сетки внутри относительного макета, а затем добавить android:layout_centerHorizontal="true" к алфавиту ImageView. Предполагая, что это ImageView.

Таким образом, ваш GridView будет обернут примерно так:

<RelativeLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_cotent"
    android:orientation="horizontal" >

    <GridView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/grid_view"
        android:layout_width="fill_parent"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:layout_height="fill_parent"
        android:numColumns="auto_fit"
        android:columnWidth="70dp"
        android:horizontalSpacing="10dp"
        android:verticalSpacing="20dp"
        android:gravity="center"
        android:stretchMode="spacingWidthUniform" >  

    </GridView>
</RelativeLayout>

А для отдельных изображений алфавита потребуется android:layout_centerHorizontal="true" вот так:

<ImageView
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_centerHorizontal="true"
</ImageView>
person Saeed Gatson    schedule 19.01.2014