(Android) 如何填充ListView背景并保持标题透明度
Posted
技术标签:
【中文标题】(Android) 如何填充ListView背景并保持标题透明度【英文标题】:(Android) How to fill ListView background and preserve header transparency 【发布时间】:2012-05-14 15:01:35 【问题描述】:我有一个自定义图像背景,它填满了 ListView 后面的整个屏幕。
ListView 有一个包含一些数据的标题,然后是一个透明的 10dp 边距(允许我们看到一点背景图像),然后是更多数据。在此标题下方,在 ListView 的“正文”中,即使其中的项目没有一直到底部,我也需要使 ListView 的背景一直填充到屏幕底部。
如果我设置 ListView 的背景,那么即使只有几个项目(或根本没有项目),我也会得到始终填充到屏幕底部的预期效果。但这也掩盖了标题中的 10dp 透明分隔线,这样我就无法再“通过”标题看到自定义背景了。
有人可以为我指出正确的路径,让 both 填充屏幕,同时保持标题内的透明分隔线吗?
有人顺便提到我可能需要创建“假”项目单元格,这些单元格可用于创建 ListView 背景的错觉,而不会影响标题的透明分隔线。但是,如果可能的话,我希望找到一个更简单的解决方案。或者如果这是最好的解决方案,看看是否有人可以给我一些关于如何以最有效的方式完成它的指示。
谢谢!
编辑:
这是我定义标题的方式,尽管我认为这个问题与 ListView 的关系比我通过 addHeaderView() 添加到 ListView 的标题更多。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_ android:layout_
android:background="@android:color/transparent" android:orientation="vertical">
<include android:id="@+view_list_header/headertop"
layout="@layout/view_list_item"/>
**<LinearLayout android:id="@+view_list_header/ll_transparent_filler"
android:layout_ android:layout_/>**
<RelativeLayout android:id="@+view_list_header/sort" android:layout_ android:layout_>
<TextView.../> <ImageView.../> <TextView.../>
</RelativeLayout>
</RelativeLayout>
所以,我尝试了各种创建 10dp 填充器的方法,目前我正在使用“空”10dp 线性布局,以便我可以获得对它的引用并在我想要时将其可见性设置为 GONE(我在我正在讨论的情况下,我没有这样做)
我这样设置 ListView 的背景:listView.setBackgroundResource(resource)。
再一次,当我为这个 ListView 设置背景时,我得到了所需的背景行为,总是填满整个屏幕,即使我添加到列表中的项目数量(顺便说一句,它们都使用相同的背景资源)我设置为 ListView) 不足以填满屏幕。但是当我这样做时,标题中的 10dp“透明边距”不可见,因为在它后面,ListViews 背景阻止了底层视图被看到。
我假设发生这种情况是因为 ListView 的背景也位于 Header 和 Footer 视图的后面。
关键是,有很多方法可以在元素之间创建一个 10dp 的“透明边距”,以允许底层视图显示出来。我的问题在于为始终填满屏幕的 ListView "body"(即不是页眉/页脚)创建背景,即使列表部分填充或为空 和 同时保留标题中的透明度,以便我仍然可以看到 ListView“后面”的视图。
【问题讨论】:
header
设置为 Listview.setHeaderView
?
是的。如果有任何细节我可以提供,请告诉我。我会发布代码,但我希望我的描述足以解释它。我愿意切换布局或任何其他可能使视图看起来像我所描述的那样。
您究竟是如何设置10dp
边距的?您希望标题与ListView
一起滚动还是可以修复?
ListView
背景将覆盖标题,因为它是标题的一部分。您没有回答我的第二个问题,您不能使用 setHeaderView
方法而是创建自己的标题(因此 ListView
背景不会覆盖它)并按照您的意愿处理它的背景。但是您将无法使标题随列表滚动。 (作为旁注,使用 @+id
作为 ids,代码可读性更好)。
对不起,我错过了你的第二个问题。不幸的是,我确实需要标题与列表一起滚动。这就是为什么我认为我可能需要找到一条替代路线,例如通过将“假”项目视图添加到列表中来“模拟”背景..我只是不知道该怎么做,或者是否有更简单的方法方式。
【参考方案1】:
您需要通过在ListView
上设置以下内容来使ListView
中的项目透明:
android:background="@android:color/transparent"
android:cacheColorHint="@android:color/transparent"
然后您的项目布局需要具有任何颜色/图像(这将放在透明度之上)。
这应该可行,但在 Android 上将是繁重的工作,因为透明度确实会对 Android 造成影响,尤其是当它位于有大量 UI 更新的 ListView
中时。
【讨论】:
谢谢,但是如果我使列表视图背景透明并使用列表项背景创建背景,那么背景会在最后一项所在的位置停止。如果有足够的项目以使它们填满整个屏幕,则此方法可以正常工作。但是,如果列表中只有几个项目(比如在屏幕的中间),那么我不会获得让列表视图背景覆盖整个屏幕的预期效果。为了以不同的方式解释我在寻找什么,我希望能够设置列表视图背景,但让这个背景不在列表视图标题后面。【参考方案2】:我通过添加彩色页脚来破解它。页脚是一个 LinearLayout,其中包含一个名为“填充”的视图,该视图设置为 5dp 高度和我想要的背景颜色。
在填充和缩放我的列表标题(之前的代码)之后,我调整了页脚以填充剩余的屏幕空间:
...
int totHeight = getTotalHeightofListView();
if((mHeader.getMeasuredHeight() + totHeight) < mList.getMeasuredHeight())
addFooterFill(mHeader.getMeasuredHeight() + totHeight);
protected int getTotalHeightofListView()
ListAdapter LvAdapter = mList.getAdapter();
int totHeight = 0;
for (int i = 0; i < mAdapter.getCount(); i++)
View mView = mAdapter.getView(i, null, mList);
mView.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
totHeight += mView.getMeasuredHeight();
return totHeight;
protected void addFooterFill(int sizeUsed)
View fill = (View) mFooter.findViewById(R.id.fill);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) fill.getLayoutParams();
params.height = mList.getMeasuredHeight() - sizeUsed;
fill.setLayoutParams(params);
理论上,即使您已经有页脚,这也应该有效。您实际上只是在页脚中调整视图的高度。
【讨论】:
【参考方案3】:如果有人仍然需要它,我已经找到了解决方案。我刚刚制作了顶部颜色为标题背景的drawable,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:right="-45dp" android:left="-45dp" android:bottom="-45dp">
<shape>
<solid android:color="@color/gray_back" />
<stroke android: android:color="@color/colorPrimaryDark" />
</shape>
</item>
我知道现在可以使用NavigationView
,但我需要快速修复当前应用。
【讨论】:
以上是关于(Android) 如何填充ListView背景并保持标题透明度的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio,如何使用数组或光标中的数据填充自定义 ListView?
Android:如何像在联系人应用程序中一样使用字母索引器和快速滚动填充 ListView。