Home / Android-Entwicklung / Die Android Arsenal – Recycler Ansichten

Die Android Arsenal – Recycler Ansichten

Mit Jubako ist es kinderleicht, umfangreiche Inhalte in einer RecyclerView wie einer Karussellwand (Recycler im Google Play-Stil in Recyclern) zusammenzusetzen. Jubako kann Inhalte asynchron und unbegrenzt mit Seitenumbrüchen laden.

Das einfachste Beispiel – "Hello Jubako! X 100"

 Klasse  HelloJubakoActivity :  AppCompatActivity 

 () {

     überschreiben  Spaß  onCreate  ( savedInstanceState :  Bundle? 
) {
         super 
 .onCreate (savedInstanceState)
        setContentView ( R 

 .layout.activity_jubako_recycler)

        recyclerView.withJubako ( this 
). load {
             für  (i  in  0  ..  100 
) {
                addView {textView ( " Hallo Jubako! " 
)}
                addView {textView ( " こ 20 ん 19 ち ュ} バ " 




)}
            }
        }
    }

     privat  lustig  textView  ( text :  string ) :  textView 
 {
         return  TextView  ( this ).  apply 



 {
            setText (Text)
        }
    }
} 

In diesem einfachen Beispiel verwenden wir einige der praktischen Erweiterungen von Jubako, um eine RecyclerView mit 100 Zeilen zu erstellen.

Erstens die Erweiterungsfunktion RecyclerView.withJubako drückt aus, welche RecyclerView wir möchten Laden in (übergebender Kontext) und anschließend Aufruf von load der beschreibt, was in das Lambda-Argument geladen werden soll.

Anschließend können Sie Jubakos withView [19459008aufrufen] Erweiterungsfunktion zur Angabe jeder Ansicht (nur eine reguläre android.view.View ), die wir für eine Zeile in unserem Recycler anzeigen möchten, die die erforderliche Heizplatte bequem unter der Haube erstellt.

Im Beispiel we Drucken Sie einfach 100 Zeilen statischen Inhalts aus, aber Jubako wurde für viel mehr als das entwickelt.

Meistens funktioniert dieser Ansatz für einfache Anwendungen, aber unter der Haube bietet Jubako eine ausführlichere Konstruktion, um kompliziertere Szenarien zu unterstützen.

Der beste Ort, um mit Jubako zu beginnen, ist es, die Beispiele in der Jubako-Beispiel-App in diesem Repository zu überprüfen.

Die Dokumentation ist im Moment grob, also der beste Ort Zu Beginn wäre es, die Beispiele auszuführen und zu studieren. https://github.com/justeat/jubako/tree/master/jubako-sample[19659028lightboxesDescribingcontent

Für jede Zeile in Jubako gibt es eine ContentDescription ]der definiert, welcher Ansichtsinhaber zu verwenden ist und welche Daten zu binden sind (in Form von LiveData ).

Bei Jubako stellen wir mit einem ContentAssembler Inhalte für die Anzeige zusammen Stellen Sie diesen Inhalt als eine Liste von ContentDescription oder genauer eine Liste von ContentDescriptionProvider bereit, wobei ein Anbieter eine Beschreibung erstellen soll.

Das folgende Beispiel zeigt eine grundlegende Implementierung einer ContentDescriptionProvider .

 Klasse  HelloContentDe scriptionProvider  ( privat  val  Sprache :  Sprache ) :  ContentDescriptionProvider  < String 

     enum  class  Language  { ENGLISH  JAPANESE 

}
    
     privater  val  Dienst  =  HelloService 

 ()
    
     überschreiben  Spaß  Beschreibung erstellen  () :  Inhaltsbeschreibung  < Zeichenfolge 
> {
         zurück  ContentDescription 
 (
             data  =  when 
 (language) {
                 ENGLISCH  - > 
 service.getHelloEnglish ()
                 JAPANISCH  - > 

 service.getHelloJapanese ()
            },
            viewHolderFactory  =  HelloViewHolderFactory 


 ()
        )
    }
} 

Eine Beschreibung hat verschiedene Eigenschaften, von denen einige erforderlich sind.

ID: Zeichenfolge (optional)

Eine eindeutige ID, die diese Zeile darstellt (verwenden Sie UUID um eine eindeutige ID zu erstellen wenn ein bestimmter Name nicht wichtig ist)

viewHolderFactory: JubakoAdapter.HolderFactory (erforderlich)

Eine Factory-Klasse, die einen ViewHolder erstellt, den Sie beim Rendern verwenden möchten.

data: LiveData? (Erforderlich)

Die Daten, die geladen werden, wobei T ein beliebiger Typ sein kann, werden später beim Rendern dieser Daten (wenn geladen) an den ViewHolder -Bind (T) übergeben. die Sie implementieren können, um den geladenen Inhalt zu rendern.

Live-Datennutzung

Jubako verwendet LiveData wie Sie Ihre Daten aus ContentDescription bereitstellen sollten ] :: data .

Wenn Jubako Ihre Daten beobachtet, erwartet er, dass Sie postValue eingeben, wenn Ihre Daten bereit sind. Die einfachste Implementierung könnte sein: –

 ContentDescription 
 (
    viewHolderFactory  =  TestViewHolderFactory 
 (),
     data  =  object :  LiveData  < String 


> () {
        überschreibe Spaß onActive () {
            Faden {
                postValue (" Hallo  Jubako ! 


")
            }.Lauf()
        }
    }) 

Im Beispiel erhalten wir, sobald unser erster Beobachter Daten beobachtet, postValue ("Hello, Jubako!") und damit Ihren entsprechenden JubakoViewHolder Daten in einem Aufruf an binden (...) .

 Klasse  ExampleViewHolder  ( Ansicht :  Ansicht ) :  JubakoViewHolder  < String 
> (Ansicht) {
     Überschreiben  Spaß  Binden  ( Daten :  Zeichenfolge? 
) {
         //  mache etwas mit Daten, wie binde sie an Views (sollte sein: - Hallo Jubako!) 


    }
} 

Sie sollten immer postValue unabhängig davon, ob Sie dies nicht tun oder nicht, Jubako wird denken, dass es warten muss, und wird derzeit auf immer warten. Die beste Strategie wäre, Ihre Ausnahmen zu erfassen und immer ein Ergebnis an postValue (...)

zu liefern. In einer Unternehmensimplementierung wäre es üblich, Daten mit dem Ergebnis der Repository-Methode mit zuzuweisen Live-Daten.

 ContentDescription 
 (
    viewHolderFactory  =  TestViewHolderFactory 
 (),
     data  = 
 repository.getData ()
    }) 

Zusammenstellen von Inhalten

Ohne die zusätzliche Bequemlichkeit von Jubako laden können wir auch Inhalte mit einer abgeleiteten Implementierung von JubakoAssembler laden.

Ein Assembler (ähnlich einem Adapter) wird verwendet, um eine Liste von Beschreibungen zu erstellen, die gerendert werden sollen (Karussells, Karten usw.). Die Basisschnittstelle hat eine einzige Funktion :: assemble () die von Jubako aufgerufen wird, wenn diese Liste zusammengestellt werden soll.

Der Inhalt wird mit dem Assembler hinzugefügt, indem Instanzen von erstellt und hinzugefügt werden ] ContentDescriptionProvider und der Zweck eines Anbieters besteht darin, eine Instanz von ContentDescription zu erstellen, in der eine Inhaltsbeschreibung definiert, welcher Ansichtsinhaber verwendet werden soll und welche Daten an den Ansichtsinhaber gebunden werden, in dem sich diese Daten befinden a LiveData .

Die einfachste Verwendung von JubakoAssembler verwendet den abgeleiteten Typ SimpleJubakoAssembler der das Zusammenstellen einfacher Inhaltslisten erleichtert, z. 19659033] val assembler = SimpleJubakoAssembler {
    add ( HelloDescriptionProvider ())
}

Jubako ruft JubakoAssembler :: assemble () asynchron (über Coroutinen) auf, und dies gibt Ihrer Implementierung die Möglichkeit, Initialisierungsarbeiten wie das Abrufen von Daten durchzuführen, um diese -Liste zu erstellen description .

Sie können Jubako mitteilen, dass Ihr Assembler noch mehr Inhalt erzeugt, wenn :: assemble erneut aufgerufen wird, indem Sie JubakoAssembler :: hasMore implementieren Inhalte, die Jubako konsumieren soll, indem Sie true oder false für mehr oder nicht mehr Inhalt zurückgeben.

Jubakos OOTB PaginatedContentLoadingStrategy übernimmt das Laden von mehr, wenn gefordert.

Warten auf den Abschluss der Montage

Wenn Jubako JubakoAssembler :: assemble aufruft, geschieht dies asynchron, was wir als Montagephase

während der Montage bezeichnen du kannst r reagieren auf Zustandsänderungen von Assembling nach Assembled und AssembleError

Der erste Zustand Assembling sagt Ihnen, dass Ihr JubakoAssembler wartet derzeit auf die Rückkehr von Assemble bevor es in den Zustand Assembled übergeht. Sie können auf diese Zustandsänderungen reagieren, wenn Sie den Inhalt wie folgt beobachten: –

 Jubako  .observe ( this ) {state  - > 
 when 
 ( Zustand) {
         ist  Jubako .  Staat .  Zusammengebaut  - > 
 {
            recyclerView.adapter  =  JubakoAdapter  (Stand.  Daten 

)
        }
         ist  Jubako .  Staat .  Zusammenbau  - > 
 {
             //  TODO zeigt einen Ladeanzeiger 


        }
         ist  Jubako .  Bundesstaat .  AssembleError  - > 
 {
             //  TODO befasst sich mit dem Fehler 



        }
    }
} 

Im obigen Beispiel besteht der allgemeine Fall für das Abhören von Assembling darin, Ladeindikatoren ein- oder auszublenden und Ausnahmen vom Aufruf von :: assemble () zu behandeln.

] Obwohl der Status Zusammengebaut angibt, dass die Zusammenbauphase abgeschlossen ist, ist dies möglicherweise nicht der beste Zeitpunkt, um Inhalte anzuzeigen. Jubako verfügt nicht nur über die Flexibilität einer asynchronen Montagephase, sondern füllt den Bildschirm auch nach dem Zusammenbau mit Inhalten, indem nacheinander Beschreibungen geladen werden, die den Bildschirm ausfüllen. Dies kann je nachdem, was Sie den einzelnen zugewiesen haben, einige Zeit in Anspruch nehmen ] ContentDescription :: data -Eigenschaft – es ist daher am besten zu wissen, wann der Bildschirm ausgefüllt ist, und Sie können dies tun, indem Sie JubakoAdapter :: onInitialFill wie im nächsten Abschnitt beschrieben

JubakoAdapter [19659029] Sobald Sie den Zustand Jubako.State.Assembled beobachten, können Sie Ihren JubakoAdapter konstruieren. Standardmäßig verwendet der Adapter PaginatedContentLoadingStrategy . Wenn Sie JubakoRecyclerView verwenden, müssen Sie keinen Layout-Manager festlegen (und dies ist auch keine gute Idee, da Jubako derzeit nur LinearLayoutManager in vertikaler Ausrichtung unterstützt). [19659066] Jubako .observe ( this ) {state - >
when (state) {
         ist Jubako . Staat . Zusammengebaut - > {
            jubakoRecycler.adapter = JubakoAdapter (Aktivität, Zustand. Daten )
        }
    }
}

Initial Fill

JubakoAdapter ruft einen Rückruf auf onInitialFill auf, der ausgeführt wird, wenn Jubako den Bildschirm zum ersten Mal mit Inhalt füllt. Dieser Rückruf kann auch verwendet werden, um Ladeanzeigen auszublenden und den Inhalt anzuzeigen (die RecyclerView ). Der Unterschied zwischen diesem Rückruf und Jubako.State.Assembled besteht darin, dass er nach dem Laden von Daten auftritt und der Bildschirm zum ersten Mal gefüllt wird, wenn Jubako.State.Assembled die ersten Daten sind loaded.

Wenn eine Ihrer Inhaltsbeschreibungen Live-Daten enthält, deren Laden einige Zeit in Anspruch nimmt, empfiehlt es sich, mit onInitialFill zu warten, bis der Bildschirm voll ist, bevor Sie von den Ladeindikatoren zum Anzeigen von Inhalten übergehen .

Neu laden

Manchmal müssen Sie eine Inhaltsbeschreibung neu laden. Dies können Sie entweder über den JubakoViewHolder oder über den JubakoAdapter

JubakoViewHolder

Das folgende Beispiel zeigt, wie Sie die Funktion reload () aus einer JubakoViewHolder-Klasse aufrufen können.

 class  ExampleViewHolder  ( view :  Vi ew ) :  JubakoViewHolder  < String 
> (view) {
     Überschreiben  Spaß  Binden  ( Daten :  Zeichenfolge? 
) {
        itemView.findViewById ( R 



 .id.error_button) .setOnClickListener {
            neu laden()
        }
    }
} 

Nachladen von JubakoAdapter

Nachladen von JubakoAdapter erfordert die ID die Sie der ContentDescription zugewiesen haben, wenn Sie eine bestimmte Beschreibung erstellt haben kann reload aufrufen, zB: -

 jubakoAdapter.reload ( SOME_UNIQUE_ID ) 

Sie können auch mit einigen beliebigen Daten ( payload ) nachladen, die an die übergeben werden ] onReload Funktion von ContentDescription (siehe onReload im nächsten Abschnitt)

 jubakoAdapter.reload ( SOME_UNIQUE_ID [19659011World! ") 

Bearbeiten eines Reloads

Sie können zwar reload für den JubakoAdapter oder JubakoViewHolder aufrufen müssen noch behandeln, was passiert, wenn es aufgerufen wird. Sie müssen die Funktion ContentDescription :: onReload implementieren, die im einfachsten Fall ContentDescription :: data mit einer neuen LiveData wie folgt neu zuordnet: -

 ContentDescription 
 (
    id  =  SOME_UNIQUE_ID 
,
    viewHolderFactory  =  TestViewHolderFactory 
 (),
     data  =  object :  LiveData  < String 


> () {
        überschreibe Spaß onActive () {
            Faden {
                postValue (" Anfangswert 



")
            }.Lauf()
        }
    },
    onReload  =  {Nutzlast  - > 
 data  =  object :  LiveData  < String 
 () {
             überschreiben  Spaß  aufActive 

 () {
                Faden {
                    postValue ( " Peek-a-Boo! $ Nutzlast " 
)
                }.  run 


 ()
            }
        }
    }) 

Das Beispiel zeigt, dass onReload eine Funktion bereitstellt, die Daten neu zuordnet. JubakoAdapter ruft dies effektiv auf, bevor es Daten beobachtet. wieder.

JubakoViewHolder-Ereignisse

Es ist möglich, Ereignisse von einem JubakoViewHolder auf JubakoAdapter zu übertragen, wobei Integrationen Ereignisse abhören können, indem sie eine Rückruffunktion für JubakoAdapter bereitstellen: : onViewHolderEvent

 Zuerst müssen wir ein Ereignis aus dem  JubakoViewHolder  auslösen, zB: - 

 class  ExampleViewHolder  ( view :  ] Ansicht ) :  JubakoViewHolder  < Zeichenfolge 
> (Ansicht) {
     init 
 {
        itemView.findViewById ( R  .id.hello_button).  apply 

 {
            setOnClickListener {
                postClickEvent ( R 



 .id.hello_button)
            }
        }
    }
} 

Später schließen wir uns an JubakoAdapter an und antworten auf das Ereignis: -

 adapter.onViewHolderEvent  = 
 {
     als 
 (es) {
         ist  JubakoViewHolder .  Ereignis .  Klicken Sie auf  - > 
.
             wann 
 (it.viewId) {
                 R  .id.hello_button  - >  showMessage ( " Hello! " 



)
            }
        }
    }
} 

Zurücksetzen

Um den Status über Konfigurationsänderungen hinweg beizubehalten, wird ein erneuter Aufruf von content.load (JubakoAssembler) nur ausgeführt, wenn Sie zuvor jubako.reset () aufrufen .

.

About AndroidWeltEditor

Check Also

Wie Android-Entwickler Benutzer auf jedem Gerät erreichen können

Gepostet von Allan Livingston, Produktmanagementdirektor, Chrome OS App Ecosystem Android unterstützt mobile Apps auf Geräten, …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.