To jest przykład tego, jak można było to zrobić wcześniej w ListView
klasie, używając parametrów divider i dividerHeight :
<ListView
android:id="@+id/activity_home_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="8dp"/>
Jednak nie widzę takiej możliwości w RecyclerView
klasie.
<android.support.v7.widget.RecyclerView
android:id="@+id/activity_home_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
Czy w takim przypadku można zdefiniować marginesy i / lub dodać niestandardowy widok podziału bezpośrednio do układu elementu listy, czy jest lepszy sposób na osiągnięcie mojego celu?
android
android-recyclerview
divider
Oczy Oczyść
źródło
źródło
com.homeretailgroup.argos.android.view.decorators.DividerItemDecoration
i używaj jej w ten sposób:mRecyclerView.addItemDecoration(new DividerItemDecoration(activity, LinearLayoutManager.VERTICAL));
Odpowiedzi:
Aktualizacja z października 2016 r
Wersja 25.0.0 biblioteki obsługi systemu Android wprowadziła
DividerItemDecoration
klasę:Stosowanie:
Poprzednia odpowiedź
Niektóre odpowiedzi albo używają metod, które stały się przestarzałe, albo nie dają kompletnego rozwiązania, więc próbowałem zrobić krótkie, aktualne podsumowanie.
W przeciwieństwie do
ListView
tejRecyclerView
klasy nie ma parametrów związanych z dzielnikiem. Zamiast tego, trzeba rozszerzyćItemDecoration
, ARecyclerView
„s klasa wewnętrzna:Vertical
rozstawItemDecoration
Rozszerz
ItemDecoration
, dodaj niestandardowy konstruktor, który zajmuje miejsceheight
jako parametr i zastąpgetItemOffsets()
metodę:Jeśli nie chcesz wstawiać spacji poniżej ostatniego elementu, dodaj następujący warunek:
Uwaga: można również modyfikować
outRect.top
,outRect.left
aoutRect.right
właściwości pożądanego efektu.Rozdzielacz
ItemDecoration
Metoda rozszerzania
ItemDecoration
i zastępowaniaonDraw()
:Możesz wywołać pierwszego konstruktora, który korzysta z domyślnych atrybutów dzielnika Androida, lub drugiego, który używa własnego rysunku, na przykład drawable / divider.xml
Uwaga: jeśli chcesz, aby dzielnik był narysowany nad twoimi przedmiotami,
onDrawOver()
zamiast tego zastąp metodę.Stosowanie
Aby użyć nowej klasy dodaj
VerticalSpaceItemDecoration
lubDividerSpaceItemDecoration
doRecyclerView
, na przykład wonCreateView()
metodzie fragmentu :Jest też biblioteka Lucasa Rochy która ma uprościć proces dekoracji przedmiotów. Jednak nie próbowałem tego.
Wśród jego funkcji są:
źródło
onDraw()
. Po prostu odwołuję się do już istniejących instancji.canvas.drawLine(startX, startY, stopX, stopY, mPaint)
wonDrawOver
? Jakaś różnica w wydajności?Poprostu dodaj
Konieczne może być również dodanie zależności
compile 'com.android.support:recyclerview-v7:27.1.0'
EDYTOWAĆ:
Aby go nieco dostosować, możesz dodać niestandardową rysownię:
Możesz swobodnie korzystać z dowolnych niestandardowych rysunków, na przykład:
źródło
Configuration
pionowego dzielnika:if (orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); } else { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}
Czy mogę skierować twoją uwagę na ten konkretny plik na Githubie autorstwa Alexa Fu: https://gist.github.com/alexfu/0f464fc3742f134ccd1e
Jest to przykładowy plik DividerItemDecoration.java „pobrany bezpośrednio z demonstracji pomocy technicznej”. ( Https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS )
Po zaimportowaniu tego pliku do mojego projektu udało mi się uzyskać linie podziału i dodać go jako dekorację przedmiotu do widoku recyklera.
Oto jak wygląda mój onCreateView w moim fragmencie zawierającym Recyclerview:
Jestem pewien, że można wykonać dodatkową stylizację, ale jest to punkt wyjścia. :)
źródło
Prosta
ItemDecoration
implementacja zapewniająca równe odstępy między wszystkimi elementami.źródło
getChildPosition
jest teraz przestarzałe,getChildAdapterPosition
można go użyć zamiast tego.super.getItemOffsets
, ponieważ twoje przesunięcia zostaną zastąpione.getChildLayoutPosition
być używany?Najprościej jest ustawić kolor tła dla RecyclerView i inny kolor tła dla przedmiotów. Oto przykład ...
oraz element TextView (może to być cokolwiek) z dolnym marginesem „x” dp lub px.
Wyjście ...
źródło
Myślę, że za pomocą prostego dzielnika pomoże
Aby dodać rozdzielacz do każdej pozycji:
1 Dodaj do tego rozciągliwej katalogu line_divider.xml
2- Utwórz klasę SimpleDividerItemDecoration
Użyłem tego przykładu do zdefiniowania tej klasy:
https://gist.github.com/polbins/e37206fbc444207c0e92
3- W aktywności lub fragmencie korzystającym z RecyclerView wewnątrz onCreateView dodaj to:
4- Aby dodać odstępy między
elementami, wystarczy dodać właściwość wypełnienia do widoku elementu
źródło
Jak już ustawiłem
ItemAnimators
.ItemDecorator
Nie wejść lub wyjść wraz z animacją.Po prostu skończyło się na tym, że w moim pliku układu widoku każdego elementu znajdował się wiersz widoku. To rozwiązało moją sprawę.
DividerItemDecoration
wydawało się, że jest to zbyt wiele magii, by zwykły podział.źródło
To proste, nie potrzebujesz tak skomplikowanego kodu
Dodaj to w swoim drawable: line_divider.xml
źródło
Ponieważ nie ma właściwego sposobu na wdrożenie tego jeszcze poprawnie przy użyciu Material Design, właśnie wykonałem następującą sztuczkę, aby bezpośrednio dodać element dzielący do elementu listy:
źródło
Sposób, w jaki obsługuję widok Divider, a także wstawki Divider, polega na dodaniu rozszerzenia RecyclerView.
1.
Dodaj nowy plik rozszerzenia, nazywając View lub RecyclerView:
i dodaj
setDivider
metodę rozszerzenia w pliku RecyclerViewExtension.kt.2)
Utwórz plik zasobów do rysowania w
drawable
pakiecie, taki jakrecycler_view_divider.xml
:gdzie możesz określić lewy i prawy margines na
android:insetLeft
iandroid:insetRight
.3)
W przypadku działania lub fragmentu, w którym zainicjowano RecyclerView, można ustawić niestandardową funkcję rysowania, wywołując:
4
Pozdrawiam 🍺
źródło
Jeśli ktoś chce tylko dodać, powiedzmy, odstęp 10dp między elementami, możesz to zrobić, ustawiając opcję rysowania na
DividerItemDecoration
:Gdzie
divider_10dp
można wyciągnąć zasób zawierający:źródło
AKTUALIZACJA PAŹDZIERNIKA 2016
Z biblioteką pomocy v25.0.0 dostępna jest domyślna implementacja podstawowych poziomych i pionowych dzielników!
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
źródło
W rzeczywistości nie rozwiązuje to problemu, ale jako tymczasowe obejście można ustawić właściwość useCompatPadding na karcie w układzie XML, aby zmierzyć ją tak samo, jak w wersjach wcześniejszych niż Lollipop.
źródło
Dla tych, którzy szukają tylko do przestrzeni pomiędzy elementami w
RecyclerView
zobacz moje podejście, gdzie można dostać równe odstępy między wszystkich elementów, z wyjątkiem pierwszej i ostatniej pozycji, gdzie dałem większy wyściółkę. Nakładam tylko na lewą / prawą stronę w poziomieLayoutManager
i na górę / dół w pozycji pionowejLayoutManager
.dimens.xml
źródło
Dodaj margines do swojego widoku, to zadziałało dla mnie.
Jeśli chcesz po prostu dodać równe odstępy i chcą to zrobić w XML , wystarczy ustawić
padding
na swoimRecyclerView
i równe ilościlayoutMargin
do elementu, który nadmuchać do swojejRecyclerView
, i niech kolor tła określenia koloru dystansową.źródło
overscroll
efekt ciągnięcia na końcu listy spowoduje, że zostanie zastosowane niepotrzebne dopełnienie, gdy dopełnienie zostanie zastosowaneRecyclerView
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" card_view:cardElevation="4dp" <!-- your item's XML here --> </android.support.v7.widget.CardView>
Wystarczy dodać tło do układu elementu do recyklingu w następujący sposób
Utwórz następujący shape_border.xml w folderze z możliwością rysowania
Oto końcowy wynik - RecyclerView z dzielnikiem.
źródło
parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1
prawdopodobnie powinna byćparent.getChildAdapterPosition(view) > 0
wraz zeoutRect.bottom = mVerticalSpaceHeight
stawaniem sięoutRect.top = mVerticalSpaceHeight
, powinna być zaakceptowaną odpowiedzią.Rozwidliłem DividerItemDecoration ze starszej wersji i uprościłem go, aby pasował do mojego przypadku użycia, a także zmodyfikowałem go, aby narysować dzielniki tak, jak są rysowane w ListView, w tym dzielnik po ostatniej pozycji listy. Będzie to również obsługiwać pionowe animacje ItemAnimator:
1) Dodaj tę klasę do swojego projektu:
2) Dodaj dekorator do RecylerView:
źródło
Zamiast tworzyć znak
shape xml
zmiany wysokości i koloru dzielnika. Możesz tworzyć programowoźródło
Zaczerpnięte z wyszukiwania w Google, dodaj ten elementDekoracja do
RecyclerView
:źródło
Ten link działał dla mnie jak urok:
https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36
Następnie w swojej działalności:
Lub to, jeśli używasz fragmentu:
źródło
mShowFirstDivider = false
,mShowLastDivider = true
, ale to nie będzie działać. Masz pomysł, dlaczego?Możemy ozdobić przedmioty przy użyciu różnych dekoratorów dołączonych do widoku recyklera, takich jak DividerItemDecoration:
Po prostu użyj następujących ... wziętych z odpowiedzi EyesClear
}, a następnie użyj powyższego w następujący sposób
Spowoduje to wyświetlenie dzielników między każdą pozycją na liście, jak pokazano poniżej:
A dla tych, którzy szukają więcej szczegółów, zapoznaj się z tym przewodnikiem Korzystanie z RecifflerView _ CodePath Android Cliffnotes
Niektóre odpowiedzi tutaj sugerują użycie marginesów, ale haczyk polega na tym, że: jeśli dodasz zarówno górny, jak i dolny margines, pojawią się oba dodane między elementami i będą zbyt duże. Jeśli dodasz tylko jedno z nich, nie będzie marginesu ani na górze, ani na dole całej listy. Jeśli dodasz połowę odległości u góry, połowę u dołu, zewnętrzne marginesy będą zbyt małe.
Tak więc jedynym poprawnym estetycznie rozwiązaniem jest dzielnik, w którym system wie, gdzie zastosować prawidłowo: między elementami, ale nie powyżej lub poniżej elementów.
Daj mi znać o wszelkich wątpliwościach w komentarzach poniżej :)
źródło
DividerItemDecoration
wygląda kod.Za późno, ale
GridLayoutManager
używam tego:Działa to dla dowolnej liczby zakresów, którą masz.
Ollie.
źródło
FlexboxLayoutManager
?Możesz łatwo dodawać programowo.
Jeśli Twoim menedżerem układu jest Linearlayout, możesz użyć:
źródło
źródło
Wydaje mi się, że potrzebna jest prosta odpowiedź oparta na kodzie, która nie korzysta z XML
źródło
Jeśli chcesz dodać to samo miejsce dla przedmiotów, najprostszym sposobem jest dodanie górnego + lewego marginesu dla RecycleView i prawego + dolnego marginesu dla elementów karty.
dimens.xml
list_item.xml
list.xml
źródło
Dodałem wiersz w elemencie listy, jak poniżej
1px narysuje cienką linię.
źródło
To
RecyclerView
trochę różni się odListView
. W rzeczywistościRecyclerView
potrzebujeListView
podobnej struktury. Na przykładLinearLayout
.LinearLayout
Zawiera parametry do dzielenia każdego elementu. W kodzie poniżej mamRecyclerView
składa się zCardView
obiektów wLinearLayout
z „dopełnienie”, która stworzy jakąś przestrzeń pomiędzy elementami. Spraw, aby ta przestrzeń była naprawdę mała, a otrzymasz linię.Oto widok Recycler w recyclinglerview_layout.xml
A oto jak wygląda każdy element (i jest podzielony ze względu na Androida: wypełnienie w LinearLayout, które otacza wszystko.) W innym pliku: cards_layout.xml
źródło
Naprawdę łatwym rozwiązaniem jest użycie RecyclerView-FlexibleDivider
Dodaj zależność:
Dodaj do swojego recyklingu:
I jesteś skończony!
źródło
1.Jedną z tych dróg jest to, że dzięki widokowi kart i widokowi recyklera możemy łatwo dodać efekt jak dzielnik. dawny. https://developer.android.com/training/material/lists-cards.html
2. a drugim jest dodanie widoku jako dzielnika do list_item_layout widoku recyklera .
źródło
Spowoduje to dodanie miejsca na górze i dole każdego elementu (lub po lewej i po prawej). Następnie możesz ustawić go na swój
recyclerView
.SizeUtils.java
źródło