You wrote:
I've tried adding padding to the ListView itself, but then when you scroll the list it disappears under the edge of the padding.
Set ListView's
clipToPadding
attribute to false
. This will enable padding around the ListView
and scrolling to the end of the layout (and not only to the edge of the padding).
An example:
<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
is an XML attribute of ViewGroup
, the base class for layouts and views containers.
The related method call is:
public void setClipToPadding (boolean clipToPadding)
Space padding = new Space(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);
The above ListView will have a header and footer padding of 20 pixels.
Appendage to @Jakobud's answer...
My listView was already making use of the android:divider/android:dividerHeight
properties to create transparent gaps between listView items. This allowed me to simply add the android:headerDividersEnabled
and android:footerDividersEnabled
properties and set the Header and Footer views to new View(Activity.this)
.
Slight simplification for cases where you already have dividers setup in the listView.
My solution using a ListFragment
, based on the solutions by @Jakobud and @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);
@Gunnar Karlsson's answer is good, but has an issue of cell views being recycled prematurely when completely behind the padding, but not yet fully off the screen. Setting clipToPadding=false is responsible for this and may or may not be fixed in a future version of android.(When using clipToPadding in ListView's the items get recycled prematurely)
I have a nice simple solution with no side effects:
android:dividerHeight="-10dip"
, the opposite of what is around the cellCompared to the other answer, there is no need to set the divider colour. The padding at the topmost and bottommost cells will be present, and the negative divider will prevent double height dividers in between.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With