Ich versuche mit dem neuen zu arbeiten RecyclerView
, aber ich konnte kein Beispiel dafür finden, dass RecyclerView
verschiedene Arten von Zeilen / Kartenansichten aufgeblasen werden.
Mit ListView
überschreibe ich das getViewTypeCount
und getItemViewType
, um verschiedene Arten von Zeilen zu behandeln.
Soll ich es wie "alt" machen oder soll ich etwas damit machen LayoutManager
? Ich fragte mich, ob mich jemand in die richtige Richtung weisen könnte. Weil ich nur Beispiele mit einem Typ finden kann.
Ich möchte eine Liste mit etwas anderen Karten haben. Oder sollte ich einfach ein scrollView
mit cardViews
innen verwenden ... mach es ohne den Adapter und recyclerView
?
Antworten:
Die Behandlung der Zeilen- / Abschnittslogik ähnlich der von UITableView in iOS ist in Android nicht so einfach wie in iOS. Wenn Sie jedoch RecyclerView verwenden, ist die Flexibilität Ihrer Möglichkeiten weitaus größer.
Am Ende geht es darum, wie Sie herausfinden, welche Art von Ansicht Sie im Adapter anzeigen. Sobald Sie das herausgefunden haben, sollte es einfach sein zu segeln (nicht wirklich, aber zumindest haben Sie das sortiert).
Der Adapter stellt zwei Methoden zur Verfügung, die Sie überschreiben sollten:
Die Standardimplementierung dieser Methode gibt immer 0 zurück, was darauf hinweist, dass es nur einen Ansichtstyp gibt. In Ihrem Fall ist dies nicht der Fall, und Sie müssen einen Weg finden, um festzustellen, welche Zeile welchem Ansichtstyp entspricht. Im Gegensatz zu iOS, das dies mit Zeilen und Abschnitten für Sie verwaltet, haben Sie hier nur einen Index, auf den Sie sich verlassen können, und Sie müssen Ihre Entwicklerfähigkeiten einsetzen, um zu wissen, wann eine Position mit einem Abschnittskopf korreliert und wann sie korreliert eine normale Reihe.
Sie müssen diese Methode trotzdem überschreiben, aber normalerweise ignorieren die Benutzer einfach den Parameter viewType. Je nach Ansichtstyp müssen Sie die richtige Layoutressource aufblasen und Ihren Ansichtshalter entsprechend erstellen. Die RecyclerView behandelt das Recycling verschiedener Ansichtstypen so, dass Konflikte zwischen verschiedenen Ansichtstypen vermieden werden.
Wenn Sie einen Standard-LayoutManager verwenden möchten, z. B.
LinearLayoutManager
, sollten Sie bereit sein. Wenn Sie planen, Ihre eigene LayoutManager-Implementierung zu erstellen, müssen Sie etwas härter arbeiten. Die einzige API, mit der Sie wirklich arbeiten müssen,findViewByPosition(int position)
gibt eine bestimmte Ansicht an einer bestimmten Position. Da Sie es wahrscheinlich je nach Typ dieser Ansicht unterschiedlich gestalten möchten , haben Sie einige Möglichkeiten:Wenn Sie das ViewHolder-Muster verwenden, legen Sie normalerweise das Tag der Ansicht mit dem Ansichtshalter fest. Sie können dies zur Laufzeit im Layout-Manager verwenden, um herauszufinden, um welchen Typ es sich bei der Ansicht handelt, indem Sie im Ansichtshalter ein Feld hinzufügen, das dies ausdrückt.
Da Sie eine Funktion benötigen, die bestimmt, welche Position mit welchem Ansichtstyp korreliert, können Sie diese Methode auch irgendwie global zugänglich machen (möglicherweise eine Singleton-Klasse, die die Daten verwaltet?), Und dann können Sie einfach dieselbe Methode entsprechend abfragen die Position.
Hier ist ein Codebeispiel:
Hier ist ein Beispiel, wie diese Ansichtshalter aussehen sollten:
In diesem Beispiel wird natürlich davon ausgegangen, dass Sie Ihre Datenquelle (myData) so erstellt haben, dass die Implementierung eines Adapters auf diese Weise einfach ist. Als Beispiel zeige ich Ihnen, wie ich eine Datenquelle erstellen würde, die eine Liste mit Namen und eine Kopfzeile für jedes Mal enthält, wenn sich der erste Buchstabe des Namens ändert (vorausgesetzt, die Liste ist alphabetisch sortiert) - ähnlich wie bei Kontakten Liste würde aussehen wie:
Dieses Beispiel löst ein ziemlich spezifisches Problem, aber ich hoffe, dies gibt Ihnen einen guten Überblick über den Umgang mit verschiedenen Zeilentypen in einem Recycler und ermöglicht es Ihnen, die erforderlichen Anpassungen in Ihrem eigenen Code vorzunehmen, um Ihren Anforderungen zu entsprechen.
quelle
names[i].substring(0, 1)
onCreateViewHolder
, mit der wir einen Ansichtshalter erstellen können. Für weitere InformationenDer Trick besteht darin, Unterklassen von ViewHolder zu erstellen und diese dann umzuwandeln.
Und dann machen Sie zur Laufzeit so etwas:
Ich hoffe es hilft.
quelle
Laut Gil großartige Antwort, die ich durch Überschreiben des getItemViewType gelöst habe, wie von Gil erklärt. Seine Antwort ist großartig und muss als richtig markiert werden. In jedem Fall füge ich den Code hinzu, um die Punktzahl zu erreichen:
In Ihrem Recycler-Adapter:
Auf diese Weise können Sie jedes benutzerdefinierte Layout für jede Zeile festlegen!
quelle
Es ist ziemlich knifflig, aber so schwer, kopieren Sie einfach den folgenden Code und Sie sind fertig
genießen !!!!
quelle
Wir können mehrere Ansichten auf einer einzelnen RecyclerView von unten erreichen: -
Abhängigkeiten von Gradle, fügen Sie also den folgenden Code hinzu: -
RecyclerView in XML
Aktivitätscode
Erstes XML
Zweites XML
Drittes XML
Jetzt ist es an der Zeit, einen Adapter zu erstellen. Dies ist wichtig, um unterschiedliche -2-Ansichten in derselben Recycler-Ansicht anzuzeigen. Überprüfen Sie daher diesen Code-Fokus vollständig: -
Sie können auch diesen Link für weitere Informationen überprüfen .
quelle
Sie müssen die
getItemViewType()
Methode in implementierenRecyclerView.Adapter
. Standardmäßig wird dieonCreateViewHolder(ViewGroup parent, int viewType)
ImplementierungviewType
dieser Methode zurückgegeben0
. Zunächst benötigen Sie den Ansichtstyp des Artikels an der Position zum Zwecke des Ansichtsrecyclings. Dazu müssen Sie diegetItemViewType()
Methode überschreiben , mit der Sie übergeben können,viewType
wodurch Ihre Position des Artikels zurückgegeben wird. Das Codebeispiel ist unten angegebenquelle
getItemViewType (int position) ist der Schlüssel
Wie es geht ?
Sie können eine
RecyclerView
mit beliebig vielen verschiedenen Ansichten (ViewHolders) erstellen. Nehmen wir zur besseren Lesbarkeit ein BeispielRecyclerView
mit zweiViewholders
.Denken Sie an diese 3 einfachen Schritte und Sie können loslegen.
getItemViewType(int position)
ViewType
in onCreateViewHolder () -Methode zurückFüllen Sie die Ansicht basierend auf der
onBindViewHolder()
Methode itemViewType inHier ist ein Code-Snippet für Sie
GitHub-Code:
Hier ist ein Projekt, in dem ich eine RecyclerView mit mehreren ViewHoldern implementiert habe.
quelle
Sie können ItemViewType einfach zurückgeben und verwenden. Siehe folgenden Code:
quelle
Sie können die Bibliothek verwenden: https://github.com/vivchar/RendererRecyclerViewAdapter
Für jedes Element sollten Sie einen ViewRenderer, ViewHolder, SomeModel implementieren:
ViewHolder - Es ist ein einfacher Ansichtshalter für die Recycler-Ansicht.
SomeModel - es ist Ihr Modell mit
ItemModel
SchnittstelleWeitere Informationen finden Sie in den Dokumentationen.
quelle
Sie können diese Bibliothek verwenden:
https://github.com/kmfish/MultiTypeListViewAdapter (von mir geschrieben)
Setup-Adapter:
Für jede Werbebuchung:
quelle