在 Android 中添加 ListView 项上方(和最后一项下方)的边距

这是一个关于 Android 中 ListView 中项目布局的非常好的问题。

我有一个活动,在顶部有一个标题栏和一个 ListView 占据了屏幕的其余部分。我希望我的 ListView 在左边、右边和顶部显示10dp 的填充,但是当你向上滚动 ListView 时,我希望它在消失在褪色边缘之前覆盖顶部的10dp 填充。类似地,当你滚动到底部时,最后一个列表项应该以10dp 的速度出现在最后一个列表项的底部和屏幕的实际底部之间(如果你想知道为什么,那是因为我想在 ListView 周围戳出一个漂亮的背景图片)。

我已经尝试向 ListView 本身添加填充,但是当您滚动列表时,它会消失在填充的边缘下面。

我来自一个 Web 开发背景,类似的情况是在第一个列表项之上添加页边距(在最后一个列表项之下)。

48108 次浏览
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);

上面的 ListView 将有一个20像素的页眉和页脚填充。

附录@雅各布的回答..。

我的 listView 已经在使用 android:divider/android:dividerHeight属性在 listView 项之间创建透明的间隔。这允许我简单地添加 android:headerDividersEnabledandroid:footerDividersEnabled属性,并将 Header 和 Footer 视图设置为 new View(Activity.this)

对于已经在 listView 中设置了分割器的情况略微简化。

你写道:

我已经尝试向 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:clipToPaddingViewGroup的 XML 属性,ViewGroup是布局和视图容器的基类。

相关的 方法调用是:

public void setClipToPadding (boolean clipToPadding)

@ Gunnar Karlsson 的回答是好的,但是有一个问题,当完全在填充物后面,但是还没有完全离开屏幕时,细胞视图被过早地回收。设置 clipToPadding= false 是造成这种情况的原因,在未来的 Android 版本中可能会修复,也可能不会修复。(当在 ListView 中使用 clipToPadd 时,这些项目会被过早地回收)

我有一个很好的简单的解决方案,没有副作用:

  1. 向 cell _ design. xml 添加外部(线性或相对)布局
  2. 在这个外部布局添加填充(即10点) ,以创建一个“边缘”周围的整个单元格。(注意: 只有填充物可以工作,外部布局不能留空白)
  3. 在 ListView 集 android:dividerHeight="-10dip"上,与单元格周围的内容相反

与另一个答案相比,没有必要设置分隔符颜色。最上面和最下面单元格的填充将存在,负分隔符将防止两者之间的双高度分隔符。

我的解决方案使用 ListFragment,基于@Jakobudd 和@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);