Добавить марку выше элемента списка 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"
, противоположном тому, что находится вокруг ячейки
По сравнению с другим ответом, нет необходимости устанавливать цвет разделителя. Будет присутствовать прокладка в самой верхней и нижней ячейках, а отрицательный делитель предотвратит промежуточные разделители высоты между ними.