2011-10-24 13 views
36

Mam ListView z paczką przedmiotów wewnątrz niego. Jak sprawić, aby górny i dolny element miał górny margines 10p na górę i dolny margines 10p na dolną pozycję? Teraz mogę to zrobić z dopełnieniem lub marginesem na ListView, ale wynik jest taki, że kiedy przewijasz krawędź ListView jest teraz 10dp od dołu ekranu. W każdym razie dookoła tego? Próbowałem również ustawić marginesy wewnątrz metody getView mojego adaptera, ale nie widzę żadnych opcji marginesów dla AbsListView.LayoutParams. Każda pomoc byłaby świetna.Wyściółka Android ListView dla zawartości bez przenoszenia wysokości ListView?

Dzięki

+1

Nasty sugestię, ale jak o górnej/dolnej wyściółki w pierwszym/ostatnim zdaniem sprzęcie? Będziesz musiał sprawdzić i ustawić go we wszystkich widokach w 'getView' ... – Knickedi

Odpowiedz

121

Sztuką jest to android:clipToPadding="false" w definicji widoku, np .:

<ListView android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="16dip" 
    android:paddingBottom="16dip" 
    android:clipToPadding="false" /> 
+1

To było dokładnie to, czego szukałem i było to proste rozwiązanie. To działało dobrze i buduję przeciwko Androidowi 2.1-update1. – Bobbake4

+1

Dlaczego tylko w systemie Android 3.0+? Zgodnie z Androidem Reference funkcje te były dostępne od samego początku (poziom API 1): http://developer.android.com/reference/android/view/ViewGroup.html#setClipToPadding(boolean) – jenzz

+0

spędziłem 45 minut próbując aby to zadziałało przy wszystkich rodzajach dopełnienia i ustawień marginesów. Nawet przyszedł do ClipToPadding, ale źle go zrozumiał i ustawił na true :) Dzięki –

5

Dlaczego nie po prostu sprawdzić położenie elementu w stosunku do wielkości swojej listy:

padding:

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     //recycle views and whatever else you normally would do goes here.. 
     //... 
     //... 

     if (position == 0){ 
      convertView.setPadding(0, 10, 0, 0); //padding on top for top item 
     } 
     else if (position == getCount() - 1){ 
      convertView.setPadding(0, 0, 0, 10); //padding on bottom for bottom item 
     } 
     else{ 
      convertView.setPadding(0, 0, 0, 0); //no padding 
     } 
} 

marginesów użytku

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
lp.setMargins(left, top, right, bottom); 
convertView.setLayoutParams(lp); 

Ex :

public View getView(int position, View convertView, ViewGroup parent) 
    { 
      //recycle views and whatever else you normally would do goes here.. 
      //... 
      //... 
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,  LinearLayout.LayoutParams.WRAP_CONTENT); 
      if (position == 0){ 
       lp.setMargins(0, 10, 0, 0); //margin on top for top item 
      } 
      else if (position == getCount() - 1){ 
       lp.setMargins(0, 10, 0, 10); //margin on bottom for bottom item 
      } 
      else{ 
       lp.setMargins(0, 0, 0, 0); //no margin 
      } 
      convertView.setLayoutParams(lp); 
    } 

To jest pod warunkiem, że prawidłowo zaimplementowano metodę getCount() dla karty.

+0

To jest doskonałe rozwiązanie. Używanie nagłówka typu G + (który pojawia się podczas przewijania w górę iw dół przy przewijaniu w górę) uniemożliwia uzyskanie widoku nagłówka i dodanie paddingu do samego listviewu. –

11

Możesz dostać miejsce na górze i dole listy ListView, w przewijanym regionie, używając nagłówków i stopek. Oto krótki przykład:

Definiowanie widoku wypełniacza, który nazwałem header_footer.xml:

<?xml version="1.0" encoding="utf-8"?> 
<View xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="10dp"/> 

Teraz metoda onCreate wygląda tak, zakładając, że nazwał swój ListView listView:

final LayoutInflater inflater = 
     (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View headerFooter = inflater.inflate(R.layout.header_footer, null); 
    listView.addFooterView(headerFooter); 
    listView.addHeaderView(headerFooter); 

A następnie ustaw adapter.

+1

Działa świetnie, wierzę we wszystkie wersje Androida, podczas gdy używanie clipToPadding (rozwiązanie powyżej) działa tylko w niektórych wersjach androd – Don

+0

Przydatna odpowiedź, dziękuję! Zmontowałem go, aby usunąć niepotrzebną złożoność. Proste 'Widok' będzie dobrze - nie ma potrzeby używania' LinearLayout' w innym 'LinearLayout'. –