Как центрировать ImageView в GridLayout? - PullRequest
0 голосов
/ 10 марта 2019

У меня полноэкранная сетка с 8 строками из 7 ImageView. Мне нужно, чтобы все строки были центрированы без пробелов между ними (теперь у меня получилось загруженное изображение). Пространство должно быть только сверху и снизу. Я уже пытался найти решение в Интернете, но я не нашел его.

XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <GridLayout
        android:id="@+id/gameGrid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:rowCount="8"
        android:columnCount="7"
        >
        <!-- ROW 1-1 -->
        <ImageView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/cellR1-1"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            app:srcCompat="@drawable/dl"
            />
        <!-- ROW 1-2 -->
        <ImageView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/cellR1-2"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            app:srcCompat="@drawable/dl"
            />
        <!-- ROW ... -->
    </GridLayout>
</RelativeLayout>

Я пытался в качестве решения установить высоту всех ImageViews равной ширине, но мой код не работал:

void setGrid(){
    //setting the cell height as the cell widht
    int imagWidth = cell[0][0].getLayoutParams().width;
    for(int r=0;r<rowCount;r++)
        for(int c=0;c<columnCount;c++) {
            cell[r][c].getLayoutParams().height = imagWidth;
            cell[r][c].requestLayout();
        }
}

Изображение:
image

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Попробуйте использовать RecyclerView с GridLayoutManager, как показано ниже:

GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 7);
            YourAdapter adapter = new YourAdapter();
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.setAdapter(adapter);

            int spacing = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16,
                    Objects.requireNonNull(getContext()).getResources().getDisplayMetrics());
            recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
                @Override
                public void getItemOffsets(@NotNull Rect outRect, @NotNull View view, @NotNull RecyclerView parent, @NotNull RecyclerView.State state) {

                    if (parent.getChildAdapterPosition(view) == Objects.requireNonNull(parent.getAdapter()).getItemCount() - 1) {
                        outRect.bottom = spacing;
                    }
                    if (parent.getChildAdapterPosition(view) == 0) {
                        outRect.top = spacing;
                    }
                }
            });

Другое решение: Вместо добавления отступов к верхним и нижним элементам, вы можете просто добавить заполнение ксверху и снизу вашего RecyclerView и установите для атрибута clipToPadding значение false.

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:paddingTop="8dp"
    android:paddingBottom="8dp" />
1 голос
/ 11 марта 2019

Может быть полезно использовать RecyclerView вместо GridLayout

RecyclerView.LayoutManager recyclerViewLayoutManager = new GridLayoutManager(getApplicationContext(), 7); // 7 means how many column you want you can change according to your requirement.
recyclerView.setLayoutManager(recyclerViewLayoutManager);
...