Как добавить дополнительное пространство внутри дна GridView
Мне нужна помощь, чтобы добавить пространство внутри GridView в нижней части. Это пространство должно быть ниже последнего элемента GridView, внутри него. Это пространство не должно работать как маржа к следующему элементу, оно должно быть видимым только тогда, когда пользователь прокручивается в нижней части GridView. Причиной этого является рекламный баннер, который частично покрывает нижнюю часть GridView. Помимо этого препятствия, пользователь должен все же видеть весь контент GridView, поэтому требуется место в нижней части 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"/>