it-swarm.com.de

Unterer Rand zum letzten Element von ListView hinzufügen

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:

ListView top

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. 

ListView bottom looks not good

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:

Fußzeile

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

Bild mit transparenten Pixeln

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:

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:

Result

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

Fügen Sie dem letzten Element in der Adapterimplementierung den unteren Rand hinzu

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.

So

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?

66
darja

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.

240
clocksmith

fügen Sie Ihrer Liste eine leere Fußzeile hinzu:

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);
6
fullMoon

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

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

2
SIr Codealot

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.

0
minimalist

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

Android:transcriptMode="alwaysScroll"  
Android:stackFromBottom="true"
0
Rohit Kumar