(Android) Как заполнить фон ListView и сохранить прозрачность заголовка

У меня есть собственный фон изображения, который заполняет весь экран за ListView.

В ListView есть заголовок, который содержит некоторые данные, затем прозрачную маржу 10dp (позволяющую нам увидеть немного фонового изображения), а затем еще несколько данных. Ниже этого заголовка, в "теле" ListView, мне нужно, чтобы фон ListView заполнил весь путь до нижней части экрана, даже если элементы внутри не доходят до конца.

Если я задаю фон ListView, тогда я получаю желаемый эффект, всегда заполняя его в нижней части экрана, даже если только пара элементов (или вообще ничего). Но это также покрывает прозрачный делитель 10dp в заголовке, так что я больше не могу видеть пользовательский фон "через" заголовок.

Может ли кто-нибудь указать мне правильный путь для получения и заполнения экрана при сохранении прозрачного разделителя внутри заголовка?

Кто-то упоминал попутно, что мне может понадобиться создать "поддельные" ячейки элементов, которые могут быть использованы для создания иллюзии фона ListView без влияния на прозрачный разделитель заголовка. Тем не менее, я надеюсь найти более легкое решение, если это возможно.. или если лучшее решение, посмотрите, может ли кто-нибудь дать мне несколько указаний о том, как это сделать наиболее эффективным образом.

Спасибо!

EDIT:

Вот как я определяю заголовок, хотя я думаю, что этот вопрос имеет больше общего с ListView, чем этот заголовок, который я добавляю в ListView через addHeaderView().

<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 " (то есть не верхнего колонтитула), который всегда заполняет экран, даже если список частично заполнен или пуст и в то же время сохраняя эту прозрачность в заголовке, чтобы я все еще мог видеть представления, которые" отстают" от ListView.

Ответ 1

Вам нужно сделать элементы в ListView прозрачными, установив следующий в ListView:

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

Затем ваши элементы Layout должны иметь любой цвет/изображение (это будет помещено поверх прозрачности).

Это должно работать, но это будет тяжелая работа над Android, поскольку прозрачность действительно сказывается на Android, особенно когда она находится в ListView, где есть много обновлений пользовательского интерфейса.

Ответ 2

Я взломал его, добавив цветной нижний колонтитул. Нижний колонтитул был LinearLayout, содержащим View, называемый "fill", установленным на 5dp height с моим желаемым цветом bg.

После заполнения и масштабирования моего заголовка списка (предыдущий код) я затем установил нижний колонтитул, чтобы заполнить оставшееся пространство экрана:

        ...

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

</item>

Я знаю, что теперь можно использовать NavigationView, но мне нужно быстро исправить текущее приложение.