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:
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.
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:
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:
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?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.
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);
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);
}
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.
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"
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.
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.
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