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

时间:2012-05-05 06:25:43

标签: android listview background header transparent

我有一个自定义图像背景,可以填充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的背景也落后于页眉和页脚视图。

关键是,有很多方法可以在元素之间创建10dp“透明边距”,以允许底层视图显示。我的问题在于为 ListView“body”(即不是页眉/页脚)创建一个总是填满屏幕的背景,即使列表部分填充或空同时在标题中保留透明度,这样我仍然可以看到ListView“后面”的视图。

3 个答案:

答案 0 :(得分:0)

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

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

然后您的项目布局需要具有任何颜色/图像(这将放在透明度的顶部)。

这应该可行,但在Android上工作量很大,因为透明度确实会对Android产生影响,特别是当它处于ListView时,会有很多UI更新。

答案 1 :(得分:0)

我通过添加彩色页脚来攻击它。页脚是一个LinearLayout,其中包含一个名为“fill”的视图,设置为5dp高度w /我想要的bg颜色。

填充后&amp;缩放我的列表标题(先前代码),然后调整页脚以填充剩余的屏幕空间:

        ...

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

理论上,即使你已经有一个页脚,这也应该有效。您实际上只是调整页脚中视图的高度。

答案 2 :(得分:0)

如果有人还需要,我已经找到了解决方法。我刚刚制作了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:width="40dp" android:color="@color/colorPrimaryDark" />
    </shape>

</item>

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