Dodanie dolnego marginesu do ListView ostatniego elementu

Muszę dodać, aby dodać ListView ze skomplikowanymi elementami tło: różne dla parzystych / nieparzystych i zaokrąglonych rogów na górze i na dole. Wygląda tak:

ListView top

Zaimplementowałem wszystkie te rzeczy poprzez level-list, ale jest jeszcze jedna rzecz, którą chcę zrobić. Teraz dolny element znajduje się w pobliżu dołu ekranu. Lepiej jest dodać trochę miejsca.

ListView bottom nie wygląda dobrze

Nie chcę dodawać dolnego marginesu do ListView, potrzebuję marginesu tylko na ostatni pozycji.

Sposoby, które widzę, aby to zrobić:

Footer

Rodzaj hack-Dodaj stopkę z pustym TextView do ListView. Ale stopki są dość niestabilne, zwykle znikają po notifyDataSetChanged i nie ma sposobu, aby je odzyskać

Obraz z przezroczystymi pikselami

Poprosiłem projektanta o dodanie przezroczystych pikseli do dolnego zasobu tła. Niestety, w tym przypadku centrowanie pionowe jest całkowicie zepsute. Na przykład, istnieje 9patch jak to:

9patch

I układ taki:

<?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>

Wynik:

Wynik

Jak widzisz, centrowanie nie działa. Niestety. (BTW, jeśli podać ten 9patch jako tło dla TextView, centrowanie działa dobrze. Jeśli znasz jakiś artykuł, wyjaśniający to, daj mi znać.)

Dodaj dolny margines do ostatniej pozycji w implementacji adaptera

To powinno zadziałać, ale z nieznanego powodu nadal nie mogę tego zrobić. Nie podoba mi się to, bo nie lubię modyfikować wymiarów w kodzie.

Więc

Istnieje już wyimaginowany sposób-skonstruowanie jakiegoś XML drawable z konkretną bitmapą i marginesem. Według drawables concept powinno być możliwe, ale nie mogę znaleźć realizacji. Może ktoś wie?

Jakieś inne pomysły?
Author: darja, 2013-07-29

7 answers

W Twoim ListView Ustaw paddingBottom i clipToPadding="false".

  <ListView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="8dp"
      android:clipToPadding="false"
      android:scrollbarStyle="outsideOverlay"/>
  • Działa to również dla RecyclerView.

  • Używaj tylko android:scrollbarStyle="outsideOverlay", jeśli chcesz, aby pasek przewijania nie przelewał się do wyściełanego obszaru.

 281
Author: clocksmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-13 00:20:45

Dodaj pustą stopkę na liście w następujący sposób:

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);
 8
Author: fullmoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 21:42:57

Możesz też zrobić to z kodu, jeśli chcesz, na przykład tutaj reaguję na aby edytować różne sytuacje:

   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);
   }
 4
Author: Gal Rom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 06:05:13

Odpowiedź zegarmistrza jest najlepsza i całkiem sprytna. Możesz także utworzyć pusty widok stopki.

 2
Author: SIr Codealot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-24 01:54:12

Dodaj te dwie linie w kodzie listView XML:

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"
 1
Author: Rohit Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 09:00:42

Innym rozwiązaniem może być wykonanie widoku makiety z określoną wysokością.

W Twoim adapterze w getViewCount return 2.

W getCount zwróć swoje dane.Rozmiar+1.

W getViewType sprawdź, czy element jest ostatnim elementem return 2;

Użyj tego typu w getView, aby wypełnić mockview.

 0
Author: hasn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-02 07:21:47

Chyba chcesz dodać margines tylko do ostatniej pozycji:

Więc można zrobić w ten sposób, w metodzie getview indeks pozycji listy i sprawdzić, czy jest to ostatnia Pozycja, a następnie progrmatycznie dodać margines do widoku.

 -2
Author: Goofy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-29 09:38:43