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

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

ListView top

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

ListView bottom looks not good

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

Как я это вижу:

Footer

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

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

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

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>

Результат:

Result

Как вы видите, центрирование не работает. К сожалению. (BTW, если указать этот 9patch в качестве фона для TextView, то центрирование работает хорошо. Если вы знаете какую-либо статью, объясняя это, сообщите мне.)

Добавить нижний предел к последнему элементу в реализации адаптера

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

Так

Существует уже мнимый способ - постройте XML-чертеж с определенным растровым изображением и маркой. В соответствии с концепцией drawables это должно быть возможно, но я не могу найти реализацию. Может быть, кто-нибудь знает?

Любые другие идеи?

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 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);
   }

Ответ 5

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

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