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“正文”(即不是页眉/页脚)创建背景,即使列表部分填充或为空同时在页眉中保留透明度,以便我仍然可以看到 ListView “后面”的视图。

4

3 回答 3

0

我通过添加彩色页脚来破解它。页脚是一个LinearLayout,其中包含一个名为“fill”的视图,高度设置为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);
}

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

于 2013-08-27T07:42:32.647 回答
0

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

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

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

这应该可行,但在 Android 上将是繁重的工作,因为透明度确实会对 Android 造成影响,尤其是ListView在有大量 UI 更新的情况下。

于 2013-07-11T04:40:33.127 回答
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,但我需要快速修复当前应用程序。

于 2015-12-04T15:59:06.100 回答