Ich muss hinzufügen, um ListView mit kompliziertem Hintergrund hinzuzufügen: unterschiedlich für gerade / ungerade und abgerundete Ecken oben und unten. Es sieht aus wie das:
Ich habe all diese Dinge über die Level-Liste implementiert, aber ich möchte noch etwas tun. Jetzt befindet sich das untere Element am unteren Bildschirmrand. Es ist besser, etwas Platz hinzuzufügen.
Ich möchte ListView keinen unteren Rand hinzufügen, ich benötige nur einen Rand für das letzte Element.
Wie ich das sehe:
Fusszeile
Eine Art Hack - Fügen Sie ListView eine Fußzeile mit leerem TextView hinzu. Fußzeilen sind jedoch ziemlich instabile Dinge. Sie verschwinden normalerweise nach notifyDataSetChanged und es gibt keine Möglichkeit, sie zurückzubekommen
Bild mit transparenten Pixeln
Ich habe den Designer gebeten, transparente Pixel zur unteren Hintergrundressource hinzuzufügen. Leider ist in diesem Fall die vertikale Zentrierung vollständig unterbrochen. Zum Beispiel gibt es 9patch wie folgt:
Und Layout wie folgt:
<?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>
Das Ergebnis:
Wie Sie sehen, funktioniert die Zentrierung nicht. Unglücklicherweise. (Übrigens, wenn Sie dieses 9-Patch als Hintergrund für TextView angeben, funktioniert die Zentrierung gut. Wenn Sie einen Artikel kennen, der dies erklärt, lassen Sie es mich bitte wissen.)
Fügen Sie dem letzten Element in der Adapter-Implementierung den unteren Rand hinzu
Das sollte funktionieren, aber aus unbekannten Gründen kann ich es immer noch nicht zum Laufen bringen. Ich mag diesen Weg nicht, weil ich Dimensionen im Code nicht ändern möchte.
So
Es gibt bereits einen imaginären Weg - konstruieren Sie XML, das mit einer bestimmten Bitmap und einem bestimmten Rand gezeichnet werden kann. Nach dem Drawables-Konzept sollte es möglich sein, aber ich kann keine Implementierung finden. Kann jemand wissen?
Irgendwelche anderen Ideen?
notifyDataSetChanged()
. Möglicherweise machen Sie etwas anderes falsch, wenn dies geschieht. Eine Fußzeile wird von der verwaltetListView
und hat wenig mit dem tatsächlichen Datensatz eines Adapters zu tun.Antworten:
Stellen Sie in Ihrem
ListView
einpaddingBottom
und einclipToPadding="false"
.Dies funktioniert auch für
RecyclerView
.Nur verwenden,
android:scrollbarStyle="outsideOverlay"
wenn die Bildlaufleiste nicht in den gepolsterten Bereich überlaufen soll.quelle
android:scrollbarStyle="outsideOverlay"
damit Ihre Bildlaufleiste nicht in der PolsterungFügen Sie Ihrer Liste eine leere Fußzeile wie folgt hinzu:
quelle
Sie können es auch aus Code machen, wenn Sie möchten, zum Beispiel hier reagiere ich auf EditText verschiedene Situationen:
quelle
Die Antwort des Uhrmachers ist die beste und ziemlich klug. Sie können auch eine leere Fußzeilenansicht erstellen.
quelle
Fügen Sie diese beiden Zeilen in Ihren listView-XML-Code ein:
quelle
Eine andere Lösung könnte darin bestehen, dass Sie eine Scheinansicht mit einer bestimmten Höhe erstellen.
In Ihrem Adapter in getViewCount geben Sie 2 zurück.
In getCount geben Sie yourData.size + 1 zurück.
Überprüfen Sie in getViewType, ob das Element das letzte Element ist. Geben Sie 2 zurück.
Verwenden Sie diesen Typ in getView, um die Mockview zu füllen.
quelle
Ich denke, Sie möchten nur dem letzten Element einen Rand hinzufügen:
Auf diese Weise können Sie in Ihrer getview-Methode den Index des Listenelements erstellen und prüfen, ob es das letzte Element ist, und dann der Ansicht schrittweise einen Rand hinzufügen.
quelle