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


147

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

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

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

我来自网络开发人员背景,类推是在第一个列表项上方(和最后一个列表项下方)添加边距。


只指定左右边距...尝试在此处粘贴xml,这样我就可以看到问题编辑:等等,您的意思是...。您还希望顶部和底部填充物也滚动吗?
Tek Yin

我无法指定左右边距-Android布局中没有“边距”,只有填充。但是,是的,我确实希望滚动顶部和底部的填充物-这是描述它的好方法。
米克·伯恩

我已经尝试了几种方法,但仍然失败..我有一些技巧可以做,但是这样做会更加困难...您将2个自定义对象放在列表项的第一个和最后一个位置..并使用自定义适配器检测物品并以不同的方式绘制(狭窄的高度和透明的)
Tek Yin

是的...那也是我一直想依靠的。但这有各种各样的复杂性,因为我需要在列表项而不是视图中设置背景色,这意味着我将需要手动破解某些效果以显示何时点击内容。无论如何,谢谢您的帮助……
米克·伯恩

好消息..我得到了解决方案...您可以在ListActivity上使用addHeaderView(View v)..只需调用getListView(). addHeaderView(capView)getListView(). addHeaderView(botView) 确保在初始化列表内容之前调用了 它。setListAdapter(adapter);
Tek Yin

Answers:


397

你写了:

我尝试过将填充添加到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)

4
此外,可以通过<item name="android:clipToPadding">false</item>
pjco

2
噢,这也适用于ScrollView
pjco

4
讨论的时间有些晚,但是请注意,在较旧的设备上(我在某些2.3.x设备上发现了它),列表项视图很快就被回收了。虽然绘制阶段知道可以在此处绘制,但布局阶段却不能,因此它认为该项目已不在屏幕上。请参阅stackoverflow.com/questions/15915226/…
杰弗里·克拉迪

@JeffreyKlardie我遇到了这样的问题:物品在较旧的设备上过早地被回收,甚至使滚动条即时调整自身大小,这看起来很奇怪。@pjco我不确定为什么,但是clipToPadding通过样式设置对我来说不起作用,就像没有应用一样。虽然,如果我直接在ListView上设置它,它可以工作。
ForceMagic 2014年

5
别忘android:scrollbarStyle="outsideOverlay"了,滚动条也会一路遍历填充
jfcartier

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像素。


4
感谢你的回答!很棒!!如果要在dp中放置高度,可以使用DisplayMetrics完成: float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
Tony Ceralva

3
或者更好的方法是,使用getResources()。getDimensionPixelOffset(R.dimen.some_value);在Java级别上使dp变暗。
greg7gkb 2012年

1
我对在StackOverflow上学到的Android知识与在开发者网站上学到的Android知识完全感到惊讶
TrueCoke

1
甚至更好(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Eugen Pechanec

1
API 23中的View没有方法“ setHeight()”。相反,我们可以使用“ setMinimumHeight()”。
KWA

10

附件为@Jakobud的答案...

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

对于您已经在listView中设置分隔线的情况,略作简化。


1
我会建议任何可能的地方使用分隔符,而不是在项目边距和填充中使用分隔符。好的答案
dzsonni

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);

1

@Gunnar Karlsson的回答很好,但是存在一个问题,即在完全位于填充之后但尚未完全移出屏幕时,会过早回收单元格视图。设置clipToPadding = false是造成这种情况的原因,并且可能会在将来的android版本中修复。(在ListView中使用clipToPadding时,这些项目会过早地回收

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

  1. 将外部(线性或相对)布局添加到cell_design.xml
  2. 在此外部布局上添加填充(即10dip),以在整个单元格周围创建一个“边距”。(仅适用于NB填充,不适用于外部布局的边距)
  3. 在ListView集合上android:dividerHeight="-10dip",与单元格周围的内容相反

与其他答案相比,无需设置分隔线颜色。在最顶部和最底部的单元格中都将出现填充,负分隔符将防止两者之间出现双重高度分隔符。


“没有副作用”并非完全正确。在视图层次结构中(尤其是在列表视图项中)添加另一层意味着降低性能。
Teovald 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.