Dies ist eine ziemlich gute Frage zum Layout von Elementen in einer ListView in Android.
Ich habe eine Aktivität mit einer Titelleiste oben und einer ListView, die den Rest des Bildschirms einnimmt. Ich möchte, dass meine ListView links, rechts und oben mit 10-dp-Auffüllung angezeigt wird. Wenn Sie jedoch die ListView nach oben scrollen, soll sie die obere 10-dp-Auffüllung abdecken, bevor sie unter der verblassten Kante verschwindet. Wenn Sie nach unten scrollen, sollte das letzte Listenelement mit 10 dp zwischen dem unteren Rand des letzten Listenelements und dem tatsächlichen unteren Bildschirmrand angezeigt werden (wenn Sie sich fragen, warum, liegt es daran, dass ich ein hübsches Hintergrundbild haben möchte in der ListView herumstochern).
Ich habe versucht, der ListView selbst eine Auffüllung hinzuzufügen, aber wenn Sie durch die Liste scrollen, verschwindet sie unter dem Rand der Auffüllung.
Ich habe einen Webentwickler-Hintergrund und die Analogie wäre, einen Rand über dem ersten Listenelement (und unter dem letzten Listenelement) hinzuzufügen.
quelle
getListView(). addHeaderView(capView)
undgetListView(). addHeaderView(botView)
stellen Sie sicher, dass es aufgerufen wird, bevor Sie den Inhalt der Liste initialisieren, z. setListAdapter (Adapter);Antworten:
Sie schrieben:
Setzen Sie das
ListView's
clipToPadding
Attribut auffalse
. Dadurch können Sie das Polster auffüllenListView
und zum Ende des Layouts (und nicht nur zum Rand des Polsters) scrollen.Ein Beispiel:
android:clipToPadding
ist ein XML-Attribut vonViewGroup
, der Basisklasse für Layouts und Ansichtscontainer.Der zugehörige Methodenaufruf lautet:
quelle
<item name="android:clipToPadding">false</item>
clipToPadding
über einen Stil funktioniert bei mir nicht. Es ist so, als würde es nicht angewendet. Wenn ich es jedoch direkt in der ListView einstelle, funktioniert es.android:scrollbarStyle="outsideOverlay"
dass die Bildlaufleiste auch die gesamte PolsterungDie obige ListView hat eine Kopf- und Fußzeile von 20 Pixel.
quelle
float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Anhang zu @ Jakobuds Antwort ...
Meine listView nutzte die
android:divider/android:dividerHeight
Eigenschaften bereits, um transparente Lücken zwischen listView-Elementen zu erstellen. Dadurch konnte ich einfach die Eigenschaften und hinzufügenandroid:headerDividersEnabled
undandroid:footerDividersEnabled
die Kopf- und Fußzeilenansichten auf setzennew View(Activity.this)
.Leichte Vereinfachung für Fälle, in denen bereits Teiler in der listView eingerichtet sind.
quelle
Meine Lösung mit a
ListFragment
basiert auf den Lösungen von @Jakobud und @ greg7gkb.quelle
Die Antwort von @Gunnar Karlsson ist gut, hat jedoch das Problem, dass Zellansichten vorzeitig recycelt werden, wenn sie sich vollständig hinter der Polsterung befinden, aber noch nicht vollständig vom Bildschirm entfernt sind. Das Setzen von clipToPadding = false ist dafür verantwortlich und kann in einer zukünftigen Android-Version behoben werden oder nicht. ( Wenn Sie clipToPadding in ListView verwenden, werden die Elemente vorzeitig recycelt. )
Ich habe eine schöne einfache Lösung ohne Nebenwirkungen:
android:dividerHeight="-10dip"
das Gegenteil von dem, was sich um die Zelle herum befindetIm Vergleich zur anderen Antwort muss die Teilerfarbe nicht eingestellt werden. Die Polsterung an den obersten und untersten Zellen ist vorhanden, und der negative Teiler verhindert Teiler mit doppelter Höhe dazwischen.
quelle