Добавить марку выше элемента списка ListView (и ниже последнего) в Android

Это довольно прекрасный вопрос о компоновке элементов в ListView в Android.

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

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

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

Ответ 1

Вы писали:

Я попытался добавить дополнение к самому списку 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)

Ответ 2

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 пикселей.

Ответ 3

Добавка к ответу @Jakobud...

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

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

Ответ 4

Мое решение с помощью 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);

Ответ 5

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

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

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

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