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


82

Мені потрібно додати, щоб додати ListView зі складним фоном елементів: різний для парних / непарних та закруглених кутів зверху та знизу. Це виглядає так:

ListView зверху

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

Знизу ListView виглядає непогано

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

Я бачу, як це зробити:

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

Своєрідний хак - додати нижній колонтитул із порожнім TextView до ListView. Але колонтитули - це досить нестабільні речі, вони зазвичай зникають після 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>

Результат:

Результат

Як бачите, центрування не працює. На жаль. (До речі, якщо вказати цей 9-патч як фон для TextView, центрування працює добре. Якщо ви знаєте будь-яку статтю, яка пояснює це, будь ласка, повідомте мене.)

Додайте нижнє поле до останнього елемента в реалізації адаптера

Це має спрацювати, але з невідомої причини я все ще не можу змусити це працювати. Мені не подобається такий спосіб, тому що я не люблю змінювати розміри в коді.

Тому

Уже є уявний спосіб - створити якийсь XML, який можна малювати з певними растровими зображеннями та полями. Відповідно до концепції малюнків, це повинно бути можливим, але я не можу знайти реалізації. Може хтось знає?

Будь-які інші ідеї?


ви просто хочете додати поля після останнього елемента?
Гуфі

Так. Питання звучить саме так
darja

Будь ласка, перевірте мою відповідь нижче
Гуфі

Насправді я б розглянув можливість використання нижнього колонтитулу. Я ніколи не бачив, щоб вони зникали самі собою, особливо не після дзвінка notifyDataSetChanged(). Можливо, ви робите щось інше неправильно, якщо це відбувається. Нижній колонтитул управляється ListViewі має мало спільного з фактичним набором даних адаптера.
МЗ.

Найкращий спосіб - [ 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 Я не розумію, чого ти хочеш. Це саме те, що це робить.
годинник

12
Не забудьте додати, android:scrollbarStyle="outsideOverlay"щоб ваша смуга прокрутки не залишалася всередині
відступів

1
можуть виникнути проблеми з кольорами. Нижня відступ має колір тла списку, а не колір останнього елемента
grine4ka

Чи можемо ми керувати індикатором оновлення SwipeRefreshLayout, використовуючи це?
Hemant Kaushik

8

додати порожній нижній колонтитул у свій список так:

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

для цього я рекомендую: listview.addFooterView (порожнє, дані: 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

Відповідь годинника найкраща і досить розумна. Ви також можете створити порожній вигляд нижнього колонтитула.


1
перше рішення не спрацювало, але ваша пропозиція зробила, справді гарна ідея дякую
Бадр

1

Додайте ці два рядки у свій список ViewView XML-код:

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"

0

Іншим рішенням може бути те, що ви робите фіктивний вигляд з певною висотою.

У вашому адаптері в getViewCount повертаємо 2.

У getCount повертає yourData.size + 1.

У getViewType перевірте, чи є елемент останнім елементом return 2;

Використовуйте цей тип у getView, щоб заповнити моквью.


-2

Думаю, ви хочете додати поля лише до останнього елемента:

Таким чином, ви можете зробити таким чином, у своєму методі getview індекс елемента списку та перевірити, чи це останній елемент, а потім прогремативно додати поле до подання.


Я описав цей спосіб у "Додати нижнє поле до останнього елемента в реалізації адаптера". Цікаво, чи є більш елегантні способи.
darja

Чому ви не хочете робити таким чином?
Гуфі

Будь ласка, дивіться відповідне пояснення.
darja

Жодних інших ідей - це, здається, єдиний шлях
darja

@Goofy Як додати поле до подання останнього рядка списку?
vrunoa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.