To całkiem dobre pytanie dotyczące układu elementów w ListView w systemie Android.
Mam działanie z paskiem tytułu u góry i ListView zajmującym resztę ekranu. Chcę, aby mój ListView pojawił się z dopełnieniem 10dp po lewej, prawej i u góry, ale kiedy przewiniesz ListView w górę, chcę, aby obejmował górne wypełnienie 10dp, zanim zniknie pod wyblakłą krawędzią. Podobnie, kiedy przewiniesz do dołu, ostatni element listy powinien pojawić się z 10 dp między dolną częścią ostatniej pozycji listy a faktycznym dolną częścią ekranu (jeśli zastanawiasz się, dlaczego, to dlatego, że jest ładny obraz tła, który chcę przeglądając ListView).
Próbowałem dodać dopełnienie do samego ListView, ale kiedy przewijasz listę, znika ona pod krawędzią wypełnienia.
Jestem twórcą stron internetowych i analogią byłoby dodanie marginesu powyżej pierwszej pozycji listy (i poniżej ostatniej pozycji listy).
źródło
getListView(). addHeaderView(capView)
igetListView(). addHeaderView(botView)
upewnij się, że zostało wywołane przed zainicjalizowaniem zawartości listy np. setListAdapter (adapter);Odpowiedzi:
Napisałeś:
Ustaw
ListView's
clipToPadding
atrybut nafalse
. Umożliwi to dopełnienieListView
i przewijanie do końca układu (a nie tylko do krawędzi wypełnienia).Przykład:
android:clipToPadding
jest atrybutem XMLViewGroup
, klasą bazową dla kontenerów układów i widoków.Powiązane wywołanie metody to:
źródło
<item name="android:clipToPadding">false</item>
clipToPadding
za pomocą stylu nie działa dla mnie, to tak, jakby nie zostało zastosowane. Chociaż, jeśli ustawię to bezpośrednio w ListView, to działa.android:scrollbarStyle="outsideOverlay"
, że pasek przewijania przechodzi również przez wypełnieniePowyższy ListView będzie miał wypełnienie nagłówka i stopki w wysokości 20 pikseli.
źródło
float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Dodatek do odpowiedzi @ Jakobud ...
Mój listView już używał tych
android:divider/android:dividerHeight
właściwości do tworzenia przezroczystych przerw między elementami listView. To pozwoliło mi wystarczy dodaćandroid:headerDividersEnabled
iandroid:footerDividersEnabled
właściwości i ustawić widoki nagłówek i stopkę donew View(Activity.this)
.Nieznaczne uproszczenie w przypadkach, w których masz już skonfigurowane separatory w listView.
źródło
Moje rozwiązanie przy użyciu a
ListFragment
, oparte na rozwiązaniach @Jakobud i @ greg7gkb.źródło
Odpowiedź @Gunnara Karlssona jest dobra, ale występuje problem z przedwczesnym odtwarzaniem widoków komórek, gdy są one całkowicie za wyściółką, ale jeszcze nie całkowicie poza ekranem. Odpowiedzialne za to jest ustawienie clipToPadding = false i może, ale nie musi, zostać naprawione w przyszłej wersji Androida ( podczas używania clipToPadding w ListView elementy są przedwcześnie poddawane recyklingowi )
Mam fajne proste rozwiązanie bez skutków ubocznych:
android:dividerHeight="-10dip"
, przeciwieństwo tego, co znajduje się wokół komórkiW porównaniu z drugą odpowiedzią nie ma potrzeby ustawiania koloru separatora. Dopełnienie w komórkach najwyższych i najniższych będzie obecne, a ujemny dzielnik zapobiegnie podwójnemu podziałowi wysokości pomiędzy.
źródło