在Android中的顶部ListView项目(以及最后一个)上方添加边距

时间:2011-06-09 04:39:17

标签: android android-layout android-listview

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

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

我尝试将填充添加到ListView本身,但是当您滚动列表时它会在填充边缘消失。

我来自网络开发背景,类比是在第一个列表项目上方(以及最后一个列表项目下方)添加边距。

5 个答案:

答案 0 :(得分:391)

您写道:

  

我尝试将填充添加到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属性,是布局和视图容器的基类。

相关的method call是:

public void setClipToPadding (boolean clipToPadding)

答案 1 :(得分:19)

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像素的页眉和页脚填充。

答案 2 :(得分:10)

附件@ Jakobud的回答......

我的listView已经使用android:divider/android:dividerHeight属性在listView项之间创建了透明的间隙。这样,我只需添加android:headerDividersEnabledandroid:footerDividersEnabled属性,并将页眉和页脚视图设置为new View(Activity.this)

对于已在listView中设置分隔符的情况进行轻微简化。

答案 3 :(得分:2)

我的解决方案使用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);

答案 4 :(得分:1)

@Gunnar Karlsson的回答很好,但是当完全在填充后面但是还没有完全离开屏幕时,有一个细胞视图被过早回收的问题。设置clipToPadding = false是对此负责的,可能会或可能不会在未来的android版本中修复。(When using clipToPadding in ListView's the items get recycled prematurely

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

  1. 将外部(线性或相对)布局添加到您的cell_design.xml
  2. 在此外部布局上添加填充(即10dip)以在整个单元格周围创建“边距”。 (N.B.只有填充可以工作,而不是外部布局上的边距)
  3. 在ListView集android:dividerHeight="-10dip"上,与单元格周围相反
  4. 与其他答案相比,无需设置分频器颜色。将存在最顶部和最底部单元格的填充,负分隔符将防止其间的双高度分隔符。