在 Android 中的顶部 ListView 项目上方(以及最后一个项目下方)添加边距
Posted
技术标签:
【中文标题】在 Android 中的顶部 ListView 项目上方(以及最后一个项目下方)添加边距【英文标题】:Add margin above top ListView item (and below last) in Android 【发布时间】:2011-09-11 09:41:00 【问题描述】:这是一个关于 android 中 ListView 中项目布局的非常好的问题。
我有一个顶部有标题栏的活动,而 ListView 占据了屏幕的其余部分。我希望我的 ListView 在左侧、右侧和顶部显示 10dp 填充,但是当您向上滚动 ListView 时,我希望它在消失在褪色边缘之前覆盖顶部 10dp 填充。同样,当您滚动到底部时,最后一个列表项应该在最后一个列表项的底部和屏幕的实际底部之间出现 10dp(如果您想知道为什么,那是因为我想要一个漂亮的背景图像在 ListView 周围探出头来)。
我尝试向 ListView 本身添加填充,但是当您滚动列表时,它会在填充边缘下消失。
我来自网络开发背景,类比是在第一个列表项上方(最后一个列表项下方)添加边距。
【问题讨论】:
仅指定左右边距...尝试在此处粘贴您的 xml,以便我可以看到问题编辑:等等,您的意思是....您希望顶部和底部填充滚动也是? 我无法指定左右边距 - Android 布局中没有“边距”,只有填充。但是,是的,我确实希望顶部和底部的内边距能够滚动——这是描述它的好方法。 我已经尝试了几种方法,但仍然失败..我有一些技巧要做,但它会更难做...你将 2 个自定义对象放在列表项的第一个和最后一个位置..并使用自定义适配器检测项目并以不同方式绘制它(窄高度和透明) 是的......这也是我一直在考虑的。但这有各种各样的复杂性,因为我需要在列表项中设置背景颜色,而不是视图,这意味着我需要手动修改一些效果来显示你何时点击了东西.无论如何感谢您的帮助... 好消息..我得到了解决方案...您可以在 ListActivity 上使用 addHeaderView(View v).. 只需调用getListView(). addHeaderView(capView)
和 getListView(). addHeaderView(botView)
确保在初始化内容之前调用它列出例如。 setListAdapter(适配器);
【参考方案1】:
你写道:
我尝试向 ListView 本身添加填充,但是当您滚动列表时,它会在填充边缘下消失。
将ListView's
clipToPadding
属性设置为false
。这将启用ListView
周围的填充和滚动到布局的末尾(而不仅仅是到填充的边缘)。
一个例子:
<ListView
android:id="@+id/list_view"
android:layout_
android:layout_
android:divider="@android:color/transparent"
android:dividerHeight="10.0sp"
android:padding="16dip"
android:clipToPadding="false"/>
android:clipToPadding
是 ViewGroup
的 XML 属性,ViewGroup
是布局和视图容器的基类。
相关的method call是:
public void setClipToPadding (boolean clipToPadding)
【讨论】:
另外,这可以通过<item name="android:clipToPadding">false</item>
制作成样式或主题
哦,这也适用于 ScrollView
讨论有点晚了,但请注意,在旧设备上(我在一些 2.3.x 设备上发现了它),列表项视图很快就会被回收。虽然绘图阶段知道它可以在那里绘制,但布局阶段不知道,所以它认为该项目已经离开屏幕。见***.com/questions/15915226/…。
@JeffreyKlardie 我遇到了在旧设备上过早回收项目的问题,它甚至使滚动条自行调整大小,这看起来很奇怪。 @pjco 我不知道为什么但是通过样式设置clipToPadding
对我不起作用,就像它没有被应用一样。虽然,如果我直接在 ListView 上设置它就可以了。
不要忘记android:scrollbarStyle="outsideOverlay"
,所以滚动条也会一直穿过填充【参考方案2】:
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 像素的页眉和页脚填充。
【讨论】:
感谢您的回答!效果很好!!如果您想将高度放在 dp 中,可以使用 DisplayMetrics 来完成:float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
或者更好的是,在 Java 级别使用 getResources().getDimensionPixelOffset(R.dimen.some_value); 获取 dp 中的维度;
我真的很惊讶我在 *** 上学到的 Android 知识与我在开发者网站上学到的相比
或者更好(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
API 23 中没有用于 View 的方法“setHeight()”。相反,我们可以使用“setMinimumHeight()”。【参考方案3】:
附加到@Jakobud 的答案...
我的 listView 已经在使用 android:divider/android:dividerHeight
属性来创建 listView 项目之间的透明间隙。这让我可以简单地添加android:headerDividersEnabled
和android:footerDividersEnabled
属性并将页眉和页脚视图设置为new View(Activity.this)
。
对于您已经在 listView 中设置了分隔符的情况进行了轻微简化。
【讨论】:
我会建议任何人尽可能使用分隔符,而不是在项目边距和填充中。很好的答案【参考方案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 中修复。(When using clipToPadding in ListView's the items get recycled prematurely)
我有一个不错的简单解决方案,没有副作用:
-
向 cell_design.xml 添加外部(线性或相对)布局
在这个外部布局上添加填充(即 10dip)以在整个单元格周围创建一个“边距”。 (注意,只有填充有效,外部布局上的边距无效)
在 ListView 集
android:dividerHeight="-10dip"
上,与单元格周围的内容相反
与其他答案相比,无需设置分隔线颜色。最顶部和最底部单元格的填充将存在,负分隔符将防止其间出现双高度分隔符。
【讨论】:
“没有副作用”这并不完全正确。在视图层次结构中添加另一层,尤其是在列表视图项中,意味着会降低性能。以上是关于在 Android 中的顶部 ListView 项目上方(以及最后一个项目下方)添加边距的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 中的顶部 ListView 项目上方(以及最后一个项目下方)添加边距
以编程方式滚动到 Android ListView 中的特定位置
更改 ListView 中当前顶部可见项的颜色 - Flutter