Добавьте поле над верхним элементом ListView (и ниже последнего) в Android - PullRequest
142 голосов
/ 09 июня 2011

Это довольно хороший вопрос о расположении элементов в ListView в Android.

У меня есть активность с заголовком вверху и ListView, занимающим остальную часть экрана. Я хочу, чтобы мой ListView отображался с отступом 10dp слева, справа и сверху, но когда вы прокручиваете ListView вверх, я хочу, чтобы он покрывал верхний отступ 10dp, прежде чем исчезнуть под выцветшим краем. Точно так же, когда вы прокручиваете до конца, последний элемент списка должен отображаться с 10dp между нижней частью последнего элемента списка и фактической нижней частью экрана (если вам интересно, почему, это потому, что мне нужно красивое фоновое изображение) ковыряться в ListView).

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

Я из сети веб-разработчиков, и аналогия будет заключаться в добавлении поля выше первого элемента списка (и ниже последнего элемента списка).

Ответы [ 5 ]

391 голосов
/ 22 января 2013

Вы писали:

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

Установите ListView's clipToPadding атрибут false.Это включит заполнение вокруг прокрутки ListView и до конца макета (а не только до края отступа).

Пример:

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="16dip"
    android:clipToPadding="false"/>

android:clipToPadding - это атрибут XML ViewGroup, базовый класс для контейнеров макетов и представлений.

Связанный вызов метода :

public void setClipToPadding (boolean clipToPadding)
19 голосов
/ 14 октября 2011
View padding = new View(this);
padding.setHeight(20); // Can only specify in pixels unfortunately. No DIP :-(

ListView myListView = (ListView) findViewById(R.id.my_list_view);

myListView.addHeaderView(padding);
myListView.addFooterView(padding);

myListView.setAdapter(myAdapter);

Приведенный выше ListView будет иметь отступ верхнего и нижнего колонтитула 20 пикселей.

10 голосов
/ 23 мая 2012

Приложение к ответу @ Jakobud ...

Мой listView уже использовал свойства android:divider/android:dividerHeight для создания прозрачных промежутков между элементами listView.Это позволило мне просто добавить свойства android:headerDividersEnabled и android:footerDividersEnabled и установить для представлений «Верхний колонтитул» и «Нижний колонтитул» значение new View(Activity.this).

Небольшое упрощение для случаев, когда в listView уже настроены разделители.

2 голосов
/ 01 ноября 2013

Мое решение использует ListFragment, основанное на решениях @Jakobud и @ greg7gkb.

ListView listView = getListView();
listView.setDivider(null);
listView.setDividerHeight(getResources().getDimensionPixelSize(R.dimen.divider_height));
listView.setHeaderDividersEnabled(true);
listView.setFooterDividersEnabled(true);
View padding = new View(getActivity());
listView.addHeaderView(padding);
listView.addFooterView(padding);
1 голос
/ 22 июля 2013

@ Ответ Гуннара Карлссона хорош, но есть проблема преждевременной переработки видов ячеек, когда они полностью находятся за отступом, но еще не полностью за кадром. За это отвечает параметр clipToPadding = false, который может быть исправлен или не исправлен в будущей версии Android. ( При использовании clipToPadding в ListView элементы преждевременно перерабатываются )

У меня есть хорошее простое решение без побочных эффектов:

  1. Добавление внешнего (линейного или относительного) макета в свой cell_design.xml
  2. На этом внешнем макете добавьте отступ (т. Е. 10 dip), чтобы создать «поле» вокруг всей ячейки. (N.B. будет работать только отступ, а не поле на внешнем макете)
  3. В ListView установлено android:dividerHeight="-10dip", противоположное тому, что находится вокруг ячейки

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...