Ich muss hinzufügen, um ListView mit komplizierten Hintergrundelementen hinzuzufügen: Unterschiedlich für gerade/ungerade und abgerundete Ecken oben und unten. Es sieht aus wie das:
Ich habe all dieses Zeug über die Level-Liste implementiert, aber ich möchte noch etwas tun ... __ Jetzt befindet sich der untere Punkt am unteren Rand des Bildschirms. Es ist besser, etwas Platz hinzuzufügen.
Ich möchte nicht den unteren Rand von ListView hinzufügen, ich brauche nur den Rand für den letzten Artikel.
Die Möglichkeiten, die ich dazu sehe:
Eine Art Hack - füge Fußzeile mit leerer TextView zu ListView hinzu. Aber Fußzeilen sind ziemlich instabil, sie verschwinden normalerweise nach notifyDataSetChanged und es gibt keine Möglichkeit, sie zurückzubekommen
Ich bat Designer, der unteren Hintergrundressource transparente Pixel hinzuzufügen. In diesem Fall ist die vertikale Zentrierung leider völlig unterbrochen. __ Zum Beispiel gibt es 9 Punkte 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 das Zentrieren nicht. Leider . (BTW, wenn Sie dieses 9patch als Hintergrund für TextView angeben, funktioniert die Zentrierung gut. Wenn Sie einen Artikel kennen, der dies erklärt, lassen Sie es mich wissen.)
Das sollte funktionieren, aber aus unbekannten Gründen kann ich immer noch nicht funktionieren. Ich mag diesen Weg nicht, weil ich nicht gerne Maße im Code ändern möchte.
Es gibt bereits eine imaginäre Methode: Erstellen Sie einige XML-Zeichnungen mit bestimmten Bitmap- und Randbereichen. Laut Drawables-Konzept sollte es möglich sein, aber ich kann keine Implementierung finden. Kann jemand wissen?
Irgendwelche anderen Ideen?
Legen Sie in Ihrem ListView
ein paddingBottom
und einen clipToPadding="false"
fest.
<ListView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:paddingBottom="8dp"
Android:clipToPadding="false"
Android:scrollbarStyle="outsideOverlay"/>
Dies funktioniert auch für RecyclerView
.
Verwenden Sie Android:scrollbarStyle="outsideOverlay"
nur, wenn die Bildlaufleiste nicht in den aufgefüllten Bereich überlaufen soll.
fügen Sie Ihrer Liste eine leere Fußzeile hinzu:
TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);
sie können es auch aus dem Code heraus machen, wenn Sie möchten, zum Beispiel reagiere ich hier auf.
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);
}
Die Antwort des Uhrmachers ist die beste und ziemlich klug. Sie können auch eine leere Fußzeilenansicht erstellen.
Eine andere Lösung könnte sein, 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.
In getViewType prüfen, ob das Element das letzte Element ist, return 2.
Verwenden Sie diesen Typ in getView, um das Mockview aufzufüllen.
Fügen Sie diese beiden Zeilen in Ihre listView XML-Code ein:
Android:transcriptMode="alwaysScroll"
Android:stackFromBottom="true"