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

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

Добавьте эти две строки в свой XML-код listView:

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"
Рохит Кумар
источник
0

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

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

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

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

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

минималист
источник
-2

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

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

Тупой
источник
Я описал этот способ в «Добавить нижнее поле к последнему элементу в реализации адаптера». Интересно, есть ли более изящные способы.
darja
Почему вы не хотите так поступать?
Goofy
См. Соответствующее объяснение.
darja
Никаких других идей - кажется, это единственный способ
Дарья
@Goofy Как добавить поле к последней строке списка?
vrunoa