Hinzufügen des unteren Randes zum letzten ListView-Element

82

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:

ListView oben

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.

ListView unten sieht nicht gut aus

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:

9patch

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:

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?

Darja
quelle
Sie möchten nur einen Rand nach dem letzten Element hinzufügen?
Goofy
Ja. Die Frage klingt genau so
Darja
Bitte überprüfen Sie meine Antwort unten
Goofy
Ich würde tatsächlich in Betracht ziehen, den Fußzeilenansatz zu verwenden. Ich habe sie noch nie alleine verschwinden sehen, besonders nicht nach einem Anruf bei notifyDataSetChanged(). Möglicherweise machen Sie etwas anderes falsch, wenn dies geschieht. Eine Fußzeile wird von der verwaltet ListViewund hat wenig mit dem tatsächlichen Datensatz eines Adapters zu tun.
MH.
Der beste Weg ist [ stackoverflow.com/questions/6288167/… [1]: stackoverflow.com/questions/6288167/… es hat mir wirklich geholfen
Bunyod

Antworten:

279

Stellen Sie in Ihrem ListViewein paddingBottomund ein clipToPadding="false".

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

  • Nur verwenden, android:scrollbarStyle="outsideOverlay"wenn die Bildlaufleiste nicht in den gepolsterten Bereich überlaufen soll.

Uhrmacher
quelle
Mein 8dp von unten ist abgeschnitten ... eigentlich möchte ich 8dp unten nur für den letzten Artikel ... also was tun?
Elizabeth
2
@ AndroidBeginner Ich verstehe nicht, was du willst. Genau das macht das.
Uhrmacher
12
Vergessen Sie nicht hinzuzufügen, android:scrollbarStyle="outsideOverlay"damit Ihre Bildlaufleiste nicht in der Polsterung
bleibt
1
Es kann Probleme mit den Farben geben. Die untere Polsterung hat die Hintergrundfarbe der Listenansicht, nicht die Hintergrundfarbe des letzten Elements
grine4ka
Können wir damit den SwipeRefreshLayout-Aktualisierungsindikator verwalten?
Hemant Kaushik
8

Fügen Sie Ihrer Liste eine leere Fußzeile wie folgt hinzu:

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);
Badr
quelle
dafür empfehle ich: listview.addFooterView (leer, Daten: null, isSelectable: false);
Simon
4

Sie können es auch aus Code machen, wenn Sie möchten, zum Beispiel hier reagiere ich auf EditText verschiedene Situationen:

   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);
   }
Gal Rom
quelle
2

Die Antwort des Uhrmachers ist die beste und ziemlich klug. Sie können auch eine leere Fußzeilenansicht erstellen.

SIr Codealot
quelle
1
Die erste Lösung hat nicht funktioniert, aber Ihr Vorschlag hat funktioniert, in der Tat gute Idee, danke
Badr
1

Fügen Sie diese beiden Zeilen in Ihren listView-XML-Code ein:

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"
Rohit Kumar
quelle
0

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.

minimalistisch
quelle
-2

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.

Doof
quelle
Ich habe dies unter "Hinzufügen des unteren Randes zum letzten Element in der Adapterimplementierung" beschrieben. Ich frage mich, ob es elegantere Wege gibt.
Darja
Warum willst du das nicht so machen?
Goofy
Bitte beachten Sie die fragliche Erklärung.
Darja
Keine anderen Ideen - so scheint der einzige Weg zu sein
darja
@Goofy Wie fügt man den Rand zur letzten Zeilenansicht der Liste hinzu?
Vrunoa