(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:自定义 ListView 不会立即填充

VC++如何获取并保存桌面背景?

Android Studio,如何使用数组或光标中的数据填充自定义 ListView?

Android:如何像在联系人应用程序中一样使用字母索引器和快速滚动填充 ListView。

如何使用 Firebase 查询的结果最终在 Android Studio 中填充 ListView

Android ListView 填充内容而不移动 ListView 高度?