Мне нужно добавить, чтобы добавить ListView со сложным фоном элементов: разным для четных / нечетных и закругленных углов вверху и внизу. Выглядит это так:
Я реализовал все это через список уровней, но хочу сделать еще кое-что. Теперь нижний элемент находится в нижней части экрана. Лучше добавить немного места.
Я не хочу добавлять нижнее поле в ListView, мне нужно поле только для последнего элемента.
Я вижу способы сделать это:
Нижний колонтитул
Своего рода хак - добавить в ListView нижний колонтитул с пустым TextView. Но нижние колонтитулы - вещь довольно нестабильная, они обычно исчезают после notifyDataSetChanged и нет возможности вернуть их.
Изображение с прозрачными пикселями
Я попросил дизайнера добавить прозрачные пиксели в нижний фоновый ресурс. К сожалению, в этом случае полностью нарушается вертикальное центрирование. Например, есть 9patch вроде этого:
И раскладка такая:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!-- View with background with transparent pixels on bottom -->
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
android:id="@+id/item"
android:background="@drawable/some_bgr"
android:padding="10dp"
>
<TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"
android:text="Title"
android:layout_gravity="center"
android:textSize="18sp"
/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Detail"
android:layout_gravity="center"
android:textSize="18sp"
/>
</LinearLayout>
<!-- Just for marking place took by view -->
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"
android:layout_below="@id/item"
android:background="#88ff55"
/>
</RelativeLayout>
Результат:
Как видите, не работает центрирование. К сожалению. (Кстати, если указать этот 9patch в качестве фона для TextView, центрирование работает хорошо. Если вы знаете какую-либо статью, объясняющую это, дайте мне знать.)
Добавить нижнее поле к последнему элементу в реализации адаптера
Это должно сработать, но по неизвестной причине я все еще не могу заставить его работать. Мне это не нравится, потому что я не люблю изменять размеры в коде.
Так
Уже есть воображаемый способ - создать какой-нибудь XML-файл с определенным растровым изображением и полями. Согласно концепции чертежей это должно быть возможно, но я не могу найти реализацию. Может кто знает?
Есть другие идеи?
notifyDataSetChanged()
. Если это происходит, возможно, вы делаете что-то еще не так. Нижний колонтитул управляетсяListView
и имеет мало общего с фактическим набором данных адаптера.Ответы:
В вашем
ListView
установитеpaddingBottom
иclipToPadding="false"
.<ListView android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="8dp" android:clipToPadding="false" android:scrollbarStyle="outsideOverlay"/>
Это также работает для
RecyclerView
.Используйте только в том
android:scrollbarStyle="outsideOverlay"
случае, если вы хотите, чтобы полоса прокрутки не выходила за пределы области с заполнением.источник
android:scrollbarStyle="outsideOverlay"
чтобы ваша полоса прокрутки недобавьте в список пустой нижний колонтитул, например:
TextView empty = new TextView(this); empty.setHeight(150); listview.addFooterView(empty);
источник
вы также можете сделать это из кода, если хотите, например, здесь я реагирую на разные ситуации EditText:
if(s.toString().length()>0) { contacts_lv.setClipToPadding(false); contacts_lv.setPadding(0,0,0,270*screenDensity); } else { contacts_lv.setClipToPadding(true); contacts_lv.setPadding(0,0,0,0); }
источник
Ответ Clocksmith - лучший и довольно умный. Вы также можете создать пустой нижний колонтитул.
источник
Добавьте эти две строки в свой XML-код listView:
android:transcriptMode="alwaysScroll" android:stackFromBottom="true"
источник
Другим решением может быть создание имитационного вида с определенной высотой.
В вашем адаптере в getViewCount return 2.
В getCount верните yourData.size + 1.
В getViewType проверьте, является ли элемент последним элементом return 2;
Используйте этот тип в getView для заполнения макета.
источник
Думаю, вы хотите добавить маржу только к последнему элементу:
Таким образом, вы можете сделать в своем методе getview индекс элемента списка и проверить, является ли он последним элементом, а затем программно добавить маржу в представление.
источник