Jak ustawić odstępy między kolumnami za pomocą RecyclerView za pomocą GridLayoutManager? Ustawienie marginesu / wypełnienia w moim układzie nie ma wpływu.
android
gridview
android-recyclerview
recycler-adapter
gridlayoutmanager
autostop. zjednoczony
źródło
źródło
GridLayoutManager
i zastąpieniagenerateDefaultLayoutParams()
i krewnych?Odpowiedzi:
RecyclerViews obsługuje koncepcję ItemDecoration : specjalne przesunięcia i rysowanie wokół każdego elementu. Jak widać w tej odpowiedzi , możesz użyć
Następnie dodaj to przez
źródło
RecyclerView
(i używaszclipToPadding="false"
), możesz nieznacznie zmienić strukturę. Jeśli tego nie zrobisz, po prostu przesuń czek if, aby był ostatnim razem (ponieważ nadal chcesz dolne wypełnienie ostatniego elementu).GridLayoutManager
. Odpowiedź nie będzie działać na układach wielokolumnowych / wierszowychPoniższy kod działa dobrze, a każda kolumna ma tę samą szerokość:
Stosowanie
1. bez krawędzi
2. z krawędzią
źródło
Poniżej znajduje się proste rozwiązanie krok po kroku, jeśli chcesz uzyskać równe odstępy wokół przedmiotów i równe rozmiary przedmiotów.
ItemOffsetDecoration
Realizacja
W kodzie źródłowym wartość dodana
ItemOffsetDecoration
doRecyclerView.
przesunięcia elementu powinna być o połowę mniejsza od rzeczywistej wartości, którą chcesz dodać jako spację między elementami.Ustaw także wartość przesunięcia elementu jako dopełnienie jej
RecyclerView
i określandroid:clipToPadding=false
.źródło
Spróbuj tego. Zadba o równe odstępy dookoła. Działa zarówno z List, Grid, jak i StaggeredGrid.
Edytowane
Zaktualizowany kod powinien obsługiwać większość przypadków narożnych z rozpiętościami, orientacją itp. Należy pamiętać, że w przypadku korzystania z setSpanSizeLookup () z GridLayoutManager, ustawienie setSpanIndexCacheEnabled () jest zalecane ze względu na wydajność.
Uwaga: wydaje się, że w przypadku StaggeredGrid istnieje błąd, w którym indeks dzieci staje się zwariowany i trudny do śledzenia, więc poniższy kod może nie działać zbyt dobrze w przypadku StaggeredGridLayoutManager.
Mam nadzieję, że to pomoże.
źródło
Poniższy kod będzie obsługiwał StaggeredGridLayoutManager, GridLayoutManager i LinearLayoutManager.
Następnie użyj go
źródło
SpaceItemDecoration
Faktycznie dodaje dopełnienie do rodzica (pogląd recyklingowa).halfSpace
dopełnienie pojawiło się (po prawej stronie), gdy nie ustawiłem dopełnienia do elementu nadrzędnego w formacie xmlOto rozwiązanie, które nie wymaga „spanCount” (liczba kolumn) Używam go, ponieważ używam GridAutofitLayoutManager (oblicza liczbę kolumn zgodnie z wymaganym rozmiarem komórki)
(uwaga: działa to tylko w GridLayoutManager )
Oto GridAutofitLayoutManager - każdy jest zainteresowany:
Wreszcie:
źródło
layoutManager.getPosition(view)
sprawdzić, czy pozycja jest zerowa, która będzie Twoim nagłówkiem. W ten sposób możesz dodać kolejny nagłówek w dowolnych pozycjach :)Jest tylko jedno łatwe rozwiązanie, które możesz zapamiętać i wdrożyć w dowolnym miejscu. Bez błędów, bez szalonych obliczeń. Umieść margines w układzie karty / przedmiotu i ustaw ten sam rozmiar co wypełnienie w RecyclerView:
item_layout.xml
activity_layout.xml
AKTUALIZACJA:
źródło
Jeśli chcesz NAPRAWIONO rozmiar
RecyclerView
przedmiotu na wszystkich urządzeniach. Możesz to zrobić w ten sposóbrecyclerview_item.xml
dimens.xml
Czynność
źródło
Wybrana odpowiedź jest prawie idealna, ale w zależności od miejsca szerokość elementów może nie być równa. (W moim przypadku było to krytyczne). Skończyłem z tym kodem, który trochę zwiększa przestrzeń, więc wszystkie elementy mają tę samą szerokość.
źródło
columnCount == 1 -> { outRect.left = space outRect.right = space }
Skopiowałem dostarczony kod @edwardaa i robię to, aby idealnie obsługiwał RTL:
źródło
Odpowiedzi powyżej wyjaśniły sposoby ustawiania obsługi marginesów GridLayoutManager i LinearLayoutManager.
Jednak w przypadku StaggeredGridLayoutManager odpowiedź Pirdada Sakhizady brzmi: „Może nie działać dobrze ze StaggeredGridLayoutManager”. To powinien być problem dotyczący IndexOfSpan.
Możesz to uzyskać w ten sposób:
źródło
Różni się nieco od odpowiedzi edwardaa, różnica polega na tym, jak kolumna jest określana, ponieważ w przypadkach takich jak przedmioty o różnych wysokościach, kolumny nie można określić po prostu%
spanCount
źródło
źródło
Oto moja modyfikacja,
SpacesItemDecoration
która może zająć numOfColums i spację równo na górze, dole, lewej i prawej stronie .i użyj poniższego kodu na swojej logice.
źródło
Istnieje bardzo proste, a jednocześnie elastyczne rozwiązanie tego problemu, wykorzystujące tylko XML, który działa na każdym narzędziu LayoutManager.
Załóżmy, że chcesz równych odstępów X (na przykład 8dp).
Zawiń swój element CardView w innym układzie
Nadaj zewnętrznemu układowi wypełnienie X / 2 (4dp)
Ustaw przezroczyste tło zewnętrznego układu
...
...
i to wszystko. Masz idealne odstępy X (8dp).
źródło
Dla tych, którzy mają problemy z staggeredLayoutManager (jak https://imgur.com/XVutH5u )
metody recyclinglerView:
czasami zwraca -1 jako indeks, abyśmy mogli napotkać problemy z ustawieniem itemDecor. Moje rozwiązanie polega na zastąpieniu przestarzałej metody ItemDecoration:
zamiast nowicjusza:
lubię to:
Do tej pory wydaje mi się, że działa :)
źródło
Odpowiedzi na to pytanie wydają się bardziej złożone niż powinny. Oto moje zdanie na ten temat.
Powiedzmy, że chcesz odstępów 1dp między elementami siatki. Wykonaj następujące czynności:
źródło
Będzie to działać również
RecyclerView
z nagłówkiem.źródło
Odpowiedź yqritc działała dla mnie idealnie. Jednak korzystałem z Kotlina, więc tutaj jest to odpowiednik.
Cała reszta jest taka sama.
źródło
Dla użytkowników StaggeredGridLayoutManager , bądź ostrożny, wiele odpowiedzi tutaj, w tym najczęściej głosowanych, oblicza kolumnę z poniższym kodem:
który zakłada, że pozycje 1/3/5 / .. zawsze znajdują się po lewej stronie, a pozycje 2/4/6 / .. zawsze znajdują się po prawej stronie. Czy to założenie jest zawsze prawdziwe? Nie.
Powiedzmy, że twój pierwszy przedmiot ma 100dp, a drugi to tylko 50dp, zgadnij gdzie jest twój trzeci przedmiot, po lewej czy po prawej?
źródło
Skończyło się to tak dla mojego RecyclerView z GridLayoutManager i HeaderView .
W poniższym kodzie ustawiam odstęp 4dp między każdym przedmiotem (2dp wokół każdego pojedynczego elementu i dopełnienie 2dp wokół całego widoku recyclingu).
layout.xml
fragment / aktywność
SpaceItemDecoration.java
Utils.java
źródło
Aby https://stackoverflow.com/a/29905000/1649371 (powyżej) zadziałało, musiałem zmodyfikować następujące metody (i wszystkie kolejne wywołania)
źródło
Ten link działał dla mnie we wszystkich sytuacjach, w których możesz spróbować.
źródło
Jeśli masz przełącznik, który przełącza między listą a siatką, nie zapomnij zadzwonić
recyclerView.removeItemDecoration()
przed ustawieniem nowej dekoracji przedmiotu. Jeśli nie, nowe obliczenia odstępów byłyby niepoprawne.Coś takiego.
źródło
Jeśli używasz żniwna z GridLayoutManager użyć tego kodu napisanego w Kotlin dla odstępy między sieciami:
I przejść
ItemDecoration
dorecyclerview
jakźródło
Podczas korzystania z CardView dla dzieci problem ze spacjami między elementami można rozwiązać, ustawiając app: cardUseCompatPadding na true.
Dla większych marginesów powiększ elewację przedmiotu. CardElevation jest opcjonalna (użyj wartości domyślnej).
źródło
dzięki odpowiedzi edwardaa https://stackoverflow.com/a/30701422/2227031
Należy również zauważyć, że:
jeśli całkowite odstępy i całkowite itemWidth nie są równe szerokości ekranu, należy również dostosować itemWidth, na przykład w metodzie adaptera onBindViewHolder
źródło
Wersja Kotlina, którą stworzyłem w oparciu o świetną odpowiedź edwardaa
źródło