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

12

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

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

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

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

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

Спасибо!

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 не позволяет увидеть базовые представления.

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

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

header устанавливается сListview.setHeaderView? Luksprog
Да, это. Если есть какие-либо подробности, которые я могу предоставить, пожалуйста, дайте мне знать. Я бы опубликовал код, но я надеюсь, что мое описание объясняет это достаточно. Я открыт для переключения макетов или чего-либо еще, что может потребоваться для того, чтобы изображение выглядело так, как я описал. Jon W
Извините, я пропустил ваш второй вопрос. К сожалению, мне нужно сделать заголовок, чтобы прокрутить список. Вот почему я думаю, что мне может понадобиться найти альтернативный маршрут, такой как «имитация». фон, добавив «поддельные» просмотры элементов в списке. Я просто не знаю, как это сделать, или есть более простой способ. Jon W
Как именно вы это установите10dp поле? Вы хотите прокрутить заголовок сListView или это можно исправить? Luksprog
ListView фон будет покрывать заголовок, потому что он является его частью. Вы не ответили на мой второй вопрос, вы не могли использоватьsetHeaderView метод и вместо этого создайте свой собственный заголовок (поэтомуListView фон не покрывает его) и заботится о его фоне, как вы хотите. Но вы не сможете прокрутить заголовок со списком. (В качестве примечания используйте@+id для идентификаторов лучше для читабельности кода). Luksprog

Ваш Ответ

3   ответа
0

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

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

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

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

@JonW удачи в создании собственного компонента;)
Спасибо, но если я сделаю фон просмотра списка прозрачным и использую фоны элементов списка для создания фона, то фон останавливается там, где находится последний элемент. Это хорошо работает, если есть достаточно элементов, чтобы они заполнили весь экран. Но если в списке всего несколько элементов (скажем, на полпути вниз по экрану), я не получаю желаемого эффекта, когда фоновый вид списка покрывает весь экран. Чтобы объяснить, что я ищу по-другому, я бы хотел иметь возможность установить фоновый вид списка, но этот фон НЕ должен идти за заголовком списка. Jon W
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 сейчас, но мне нужно было быстрое решение для текущего приложения.

0

добавив цветной колонтитул. Нижний колонтитул представлял собой 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);
}

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

Похожие вопросы