Как добавить дополнительное пространство внутри дна GridView

Мне нужна помощь, чтобы добавить пространство внутри GridView в нижней части. Это пространство должно быть ниже последнего элемента GridView, внутри него. Это пространство не должно работать как маржа к следующему элементу, оно должно быть видимым только тогда, когда пользователь прокручивается в нижней части GridView. Причиной этого является рекламный баннер, который частично покрывает нижнюю часть GridView. Помимо этого препятствия, пользователь должен все же видеть весь контент GridView, поэтому требуется место в нижней части GridView.

left: ad (blue) covers part of GridView elements (orange); right: ad covers the space in the bottom of the GridView left: ad (синий) охватывает часть элементов GridView (оранжевый); right: ad охватывает пространство в нижней части GridView

same approach but with space at the bottom

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

Пока я пытался работать с переменными Padding и Marging Variables для Bottom, но они не являются правильными переменными для проблемы. Я также просматривал stackoverflow, я нашел несколько похожих вопросов, таких как: Добавить дополнительное пространство в нижней части GridView или ListView или: Добавление нижний колонтитул Просмотр многоколоночного GridView в Android?. Но решения, похоже, не подходят для моего случая, и, кроме того, я ищу решение внутри файла макета, а не внутри исходного кода (если есть, конечно).

Ваша помощь очень ценится.

Ответ 1

Чтобы достичь этого, вам нужно добавить нижнее дополнение к вашему GridView, но также отключить поведение clipToPadding. Попробуйте XML-код ниже:

<GridView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="50dp"
    android:clipToPadding="false"/>

Вы также можете сделать это из кода, если хотите. Преимущество состоит в том, что вы можете динамически вычислять смещение в коде:

gridView.setPadding(int left, int top, int right, int bottom);
gridView.setClipToPadding(false);

Примечание. Если вы не отключите поведение clipToPadding, вы получите постоянную пустую область в нижней части вашего GridView, поэтому очень важно отключить ее.


Бонус. Здесь также хорошая ссылка об использовании параметра clipToPadding в ListView или GridView: https://plus.google.com/+AndroidDevelopers/posts/LpAA7q4jw9M

Ответ 2

Создайте собственный метод gridview и в методе getview(), используйте представление, которое делает пространство таким, как вы хотите.

Ответ 3

Это то, что у меня было до сих пор:

В вашей деятельности:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grid);

        final TextView txt = (TextView) findViewById(R.id.textView1);
        txt.setVisibility(View.GONE);

        final GridView grid = (GridView) findViewById(R.id.gridViewCustom);


        grid.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                if((firstVisibleItem + visibleItemCount) == totalItemCount){//it means you are at the end of the gridview
                    txt.setVisibility(View.VISIBLE);
                    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, 50);
                    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
                    params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
                    params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);

                    RelativeLayout.LayoutParams paramsGrid = (RelativeLayout.LayoutParams) grid.getLayoutParams();
                    paramsGrid.addRule(RelativeLayout.ABOVE, txt.getId());

                    txt.setLayoutParams(params);
                    grid.setLayoutParams(paramsGrid);

                }
            }
        });
    }

.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

   <GridView
       android:id="@+id/gridViewCustom"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:layout_above="@+id/textView1"
       android:layout_alignParentRight="true"
       android:layout_margin="4dp"
       android:columnWidth="80dp"
       android:gravity="center"
       android:numColumns="auto_fit"
       android:stretchMode="columnWidth" >
   </GridView>

   <TextView
       android:id="@+id/textView1"
       android:layout_width="wrap_content"
       android:layout_height="50dp"
       android:layout_alignParentBottom="true"
       android:layout_alignParentLeft="true"
       android:layout_alignParentRight="true"
       android:text=""
       android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

Ответ 4

Чтобы получить следующий результат GridView с пробелом над кнопкой

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn_submit"
        style="@style/Base.Widget.AppCompat.Button.Colored"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/gv_someGrid"
        android:layout_margin="10dp"
        android:layout_alignParentBottom="true"
        android:text="submit" />

    <GridView
        android:id="@+id/gv_someGrid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_above="@+id/btn_submit" />
</RelativeLayout>

Трюк состоит в том, чтобы объявить Gridview внизу этой кнопки, затем добавить ограничение layout_above = "@+ id/your_id"

Ответ 5

<GridView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:marginBottom="50dp"
    android:clipToPadding="false"/>