(Android)如何填充ListView背景并保留标题栏透明度

13

我有一个自定义的图像背景,它填充了ListView后面的整个屏幕。

ListView有一个包含某些数据的标题,然后是透明的10dp边距(允许我们看到一点背景图像),然后是更多的数据。在这个标题下面,在ListView的“正文”中,即使其中的项目没有全部到达底部,我也需要使ListView的背景完全填充到屏幕底部。

如果我设置了ListView的背景,那么即使只有几个项目(或没有任何项目),也能获得始终填充到屏幕底部的效果。但是这也会覆盖标题中的10dp透明分隔线,因此我不能再“透过”标题看到自定义背景。

请问有人可以指点一下我如何既实现填充到屏幕底部又保持标题内的透明分隔线吗?

有人提到过,我可能需要创建“虚假”的单元格,以创建ListView背景的幻象,而不影响标题的透明分隔线。但是,我希望能找到一个更简单的解决方案,如果可能的话..或者如果那是最好的解决方案,看看是否有人能够给我一些关于如何以最有效的方式实现它的指针。

谢谢!

编辑:

这是我如何定义标题的方式,虽然我认为这个问题更多地涉及ListView,而我是通过addHeaderView()将其添加到ListView中的。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="wrap_content"
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_width="fill_parent" android:layout_height="10dp"/>**     

    <RelativeLayout android:id="@+view_list_header/sort" android:layout_width="fill_parent" android:layout_height="wrap_content">
        <TextView.../> <ImageView.../> <TextView.../>
    </RelativeLayout>
</RelativeLayout>

目前我已经尝试了多种方法来创建一个10dp的填充物,目前我正在使用一个“空”的10dp LinearLayout来获得对它的引用,并且在需要时将其可见性设置为GONE(但在我讨论的情况下我没有这样做)。

我这样设置ListView的背景:listView.setBackgroundResource(resource)。

同样,当我将背景设置为该ListView时,无论我添加到列表中的项目数量是否足以填满屏幕(顺便提一下,它们都使用我设置给ListView的相同背景资源),我都会得到所需的背景始终填满整个屏幕的效果。 但是,当我这样做时,在标题的10dp“透明边距”不可见,因为在它后面,ListViews背景阻止了底层视图的显示。

我认为这是因为ListView的背景也会出现在Header和Footer视图之后。

问题在于,有很多方法可以在元素之间创建一个10dp的“透明边距”,以允许底层视图显示出来。 我的问题在于如何为ListView“正文”(即非Header / Footer部分)创建一个背景,使其始终填满屏幕,即使列表仅填充了部分或为空,同时保留标题中的透明度,以便我仍然可以看到“在”ListView后面的视图。


“header” 是通过 Listview.setHeaderView 设置的吗? - user
你要如何设置那个 10dp 的边距?你希望标题栏随着 ListView 滚动还是固定不动? - user
@JonW 你有解决这个问题吗?我现在也有同样的需求。 - Brian Chang
@BrianChang 不,我没有。也许你可以让ListView填满整个屏幕。我的上面还有另一个布局,它也有透明背景,我希望通过它也能看到自定义的背景图像,所以这对我来说不是一个选项。如果你可以让ListView占据整个屏幕,并设置其所需的背景,则标题或单元格中的任何透明度都将显示为所需的。我相信这会少很多麻烦。希望我能提供更多帮助,祝好运。 - Jon W
@JonW 如果你使用 <RelativeLayout> <ImageView/> <ListView/> <RelativeLayout/>,而不是设置背景,这样会提供一个固定的背景,并创造出列表项在其上方的错觉。希望能有所帮助。 - Jayshil Dave
显示剩余3条评论
3个回答

0

我已经找到了解决方案,如果还有人需要的话。我只是制作了一个可绘制对象,将顶部颜色设置为标题背景,就像这样:

<?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:width="40dp" android:color="@color/colorPrimaryDark" />
    </shape>

</item>

我知道现在可以使用NavigationView,但是我需要快速修复当前应用程序。


0

您需要通过在 ListView 上设置以下内容来使项目透明:

android:background="@android:color/transparent"
android:cacheColorHint="@android:color/transparent"

然后你的项目布局需要有任何颜色/图像(这将放在透明度之上)。

这应该可以工作,但在Android上会很耗费资源,特别是当它在ListView中时,因为透明度对Android的影响非常大,尤其是在有大量UI更新的情况下。


谢谢,但是如果我将listview背景设置为透明,并使用列表项背景来创建背景,则背景会在最后一个项目处停止。 如果有足够的项目填满整个屏幕,则可以正常工作。 但是,如果列表中只有几个项目(例如屏幕的一半),则我无法获得所需的效果,即使列表视图背景覆盖整个屏幕。 为了以不同的方式解释我正在寻找的内容,我希望能够设置listview背景,但是此背景不会出现在listview标题后面。 - Jon W

0

我通过添加一个有颜色的页脚来进行了黑客攻击。页脚是一个LinearLayout,其中包含一个名为“fill”的View,设置为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);
}

理论上,即使您已经有页脚,这也应该可以工作。您实际上只是调整页脚中视图的高度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接