05 мая 2012 г., 20:57 от Jon W

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

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

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

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

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

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

Спасибо!

EDIT:

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

<code><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>
</code>

Итак, я попробовал различные способы создания наполнителя 10dp, в настоящее время я использую «пустой». 10dp LinearLayout, чтобы я мог получить ссылку на него и установить его видимость GONE, когда я хочу (что я НЕ делаю в случае, который я обсуждаю)

Я устанавливаю фон ListView следующим образом: listView.setBackgroundResource (resource).

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

I am assuming this happens because the ListView's background also goes behind the Header and Footer views.

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

Ответы на вопрос (0)

27 авг. 2013 г., 09:42 от radley

добавив цветной колонтитул. Нижний колонтитул представлял собой LinearLayout, содержащий представление с именем & quot; fill & quot; установите высоту 5dp с желаемым цветом 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);
}

Теоретически это должно работать, даже если у вас уже есть нижний колонтитул. По сути, вы просто регулируете высоту представления в нижнем колонтитуле.

11 июл. 2013 г., 06:40 от Warpzit

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

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

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

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

04 дек. 2015 г., 16:59 от head01

если кому-то еще это нужно. Я только что сделал 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 сейчас, но мне нужно было быстрое решение для текущего приложения.

ВАШ ОТВЕТ НА ВОПРОС