(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
, но мне нужно быстро исправить текущее приложение.