Добавление нижнего поля к последнему элементу ListView


83

Мне нужно добавить, чтобы добавить ListView со сложным фоном элементов: разным для четных / нечетных и закругленных углов вверху и внизу. Выглядит это так:

ListView вверху

Я реализовал все это через список уровней, но хочу сделать еще кое-что. Теперь нижний элемент находится в нижней части экрана. Лучше добавить немного места.

Нижняя часть ListView выглядит не очень хорошо

Я не хочу добавлять нижнее поле в ListView, мне нужно поле только для последнего элемента.

Я вижу способы сделать это:

Нижний колонтитул

Своего рода хак - добавить в ListView нижний колонтитул с пустым TextView. Но нижние колонтитулы - вещь довольно нестабильная, они обычно исчезают после notifyDataSetChanged и нет возможности вернуть их.

Изображение с прозрачными пикселями

Я попросил дизайнера добавить прозрачные пиксели в нижний фоновый ресурс. К сожалению, в этом случае полностью нарушается вертикальное центрирование. Например, есть 9patch вроде этого:

9 патч

И раскладка такая:

<?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-файл с определенным растровым изображением и полями. Согласно концепции чертежей это должно быть возможно, но я не могу найти реализацию. Может кто знает?

Есть другие идеи?


вы просто хотите добавить маржу после последнего элемента?
Goofy

Да. Вопрос звучит именно так
Дарья

Пожалуйста, проверьте мой ответ ниже
Гуфи

Я бы действительно подумал об использовании подхода нижнего колонтитула. Я никогда не видел, чтобы они исчезали сами по себе, особенно после звонка notifyDataSetChanged(). Если это происходит, возможно, вы делаете что-то еще не так. Нижний колонтитул управляется ListViewи имеет мало общего с фактическим набором данных адаптера.
MH.

Лучший способ - [ stackoverflow.com/questions/6288167/… [1]: stackoverflow.com/questions/6288167/… мне действительно помогло »
Bunyod

Ответы:


280

В вашем 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"случае, если вы хотите, чтобы полоса прокрутки не выходила за пределы области с заполнением.


мой 8dp снизу обрезан ... на самом деле я хочу 8dp снизу только для последнего элемента .. так что же делать?
Элизабет

2
@AndroidBeginner Я не понимаю, чего вы хотите. Это именно то, что он делает.
clocksmith

12
Не забудьте добавить, android:scrollbarStyle="outsideOverlay"чтобы ваша полоса прокрутки не
оставалась

1
могут быть проблемы с цветами. Нижний отступ имеет цвет фона представления списка, а не цвет фона последнего элемента
grine4ka

Можем ли мы управлять индикатором обновления SwipeRefreshLayout, используя это?
Хемант

8

добавьте в список пустой нижний колонтитул, например:

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);

для этого я рекомендую: listview.addFooterView (empty, data: null, isSelectable: false);
Саймон

4

вы также можете сделать это из кода, если хотите, например, здесь я реагирую на разные ситуации 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);
   }

2

Ответ Clocksmith - лучший и довольно умный. Вы также можете создать пустой нижний колонтитул.


1
первое решение не сработало, но ваше предложение сработало, действительно хорошая идея, спасибо
Бадр


0

Другим решением может быть создание имитационного вида с определенной высотой.

В вашем адаптере в getViewCount return 2.

В getCount верните yourData.size + 1.

В getViewType проверьте, является ли элемент последним элементом return 2;

Используйте этот тип в getView для заполнения макета.


-2

Думаю, вы хотите добавить маржу только к последнему элементу:

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


Я описал этот способ в «Добавить нижнее поле к последнему элементу в реализации адаптера». Интересно, есть ли более изящные способы.
darja

Почему вы не хотите так поступать?
Goofy

См. Соответствующее объяснение.
darja

Никаких других идей - кажется, это единственный способ
Дарья

@Goofy Как добавить поле к последней строке списка?
vrunoa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.