RecyclerView – části a funkce

RecyclerView zpracovává některé úkoly interně (například posouvání a recyklace zobrazení), ale v podstatě je to manažer, který koordinuje pomocné třídy k zobrazení kolekce. RecyclerView deleguje úkoly na následující pomocné třídy:

  • Adapter – Nafoukne rozložení položek (vytvoří instanci obsahu souboru rozložení) a vytvoří vazbu dat k zobrazením zobrazeným v rámci objektu RecyclerView. Adaptér také hlásí události kliknutí na položku.

  • LayoutManager – Míry a umístění zobrazení položek v rámci RecyclerView a spravuje zásady pro recyklaci zobrazení.

  • ViewHolder – Vyhledá a uloží odkazy na zobrazení. Držák zobrazení také pomáhá při zjišťování kliknutí na zobrazení položek.

  • ItemDecoration – Umožňuje aplikaci přidat zvláštní posuny výkresu a rozložení do konkrétních zobrazení pro výkres děliče mezi položkami, zvýrazněním a hranicemi seskupení vizuálů.

  • ItemAnimator – Definuje animace, které se provádějí během akcí položky nebo při změnách adaptéru.

Vztah mezi RecyclerView, LayoutManagera Adapter třídy je znázorněn v následujícím diagramu:

Diagram of RecyclerView containing LayoutManager, using Adapter to access Data Set

Jak je znázorněno na tomto obrázku, LayoutManager lze si představit jako zprostředkovatel mezi Adapter a RecyclerView. Volání LayoutManager do Adapter metod jménem RecyclerView. LayoutManager Například volání Adapter metody, když je čas vytvořit nové zobrazení pro konkrétní pozici položky v RecyclerView. Nafoukne Adapter rozložení pro danou ViewHolder položku a vytvoří instanci (nezobrazuje se) pro uložení odkazů na zobrazení v dané pozici. LayoutManager Když volání Adapter pro vazbu konkrétní položky s datovou sadou vyhledá Adapter data pro danou položku, načte je ze sady dat a zkopíruje ji do přidruženého zobrazení položky.

Při použití RecyclerView v aplikaci je nutné vytvořit odvozené typy následujících tříd:

  • RecyclerView.Adapter – Poskytuje vazbu ze sady dat vaší aplikace (která je specifická pro vaši aplikaci) k zobrazením položek zobrazeným v rámci RecyclerViewaplikace . Adaptér ví, jak přidružit každou pozici zobrazení položek ke RecyclerView konkrétnímu umístění ve zdroji dat. Kromě toho adaptér zpracovává rozložení obsahu v rámci každého zobrazení jednotlivých položek a vytvoří držák zobrazení pro každé zobrazení. Adaptér také hlásí události kliknutí na položku, které jsou zjištěny zobrazením položky.

  • RecyclerView.ViewHolder – Ukládá do mezipaměti odkazy na zobrazení v souboru rozložení položky, aby se vyhledávání prostředků zbytečně neopakuje. Držitel zobrazení také uspořádá události kliknutí na položku, které mají být předány adaptéru, když uživatel klepne na přidružené zobrazení položky vlastníka zobrazení.

  • RecyclerView.LayoutManager – Umístí položky v rámci RecyclerView. Můžete použít jednoho z několika předdefinovaných správců rozložení nebo můžete implementovat vlastního správce rozložení. RecyclerView deleguje zásadu rozložení na správce rozložení, takže se můžete připojit k jinému správci rozložení, aniž byste museli provádět významné změny aplikace.

Volitelně můžete také rozšířit následující třídy, abyste změnili vzhled a chování RecyclerView aplikace:

  • RecyclerView.ItemDecoration
  • RecyclerView.ItemAnimator

Pokud neprodloužíte ItemDecoration a ItemAnimatorpoužijete RecyclerView výchozí implementace. Tato příručka nevysvětluje, jak vytvořit vlastní ItemDecoration třídy a ItemAnimator třídy. Další informace o těchto třídách naleznete v tématu RecyclerView.ItemDecoration a RecyclerView.ItemAnimator.

Jak funguje recyklace zobrazení

RecyclerView nepřiděluje zobrazení položek pro každou položku ve zdroji dat. Místo toho přiděluje pouze počet zobrazení položek, která se vejdou na obrazovku, a znovu použije rozložení těchto položek při posouvání uživatelem. Když se zobrazení poprvé posune mimo dohled, prochází procesem recyklace znázorněný na následujícím obrázku:

Diagram illustrating the six steps of view recycling

  1. Když se zobrazení posune mimo dohled a už se nezobrazí, stane se zobrazením šrotu.

  2. Zobrazení výstřižků se umístí do bazénu a stane se z něj recyklování. Tento fond je mezipaměť zobrazení, která zobrazují stejný typ dat.

  3. Když se zobrazí nová položka, zobrazí se zobrazení z fondu recyklace pro opakované použití. Vzhledem k tomu, že toto zobrazení musí být před zobrazením znovu vázáno adaptérem, označuje se jako špinavé zobrazení.

  4. Špinavé zobrazení je recyklováno: Adaptér vyhledá data pro další položku, která se mají zobrazit, a zkopíruje tato data do zobrazení této položky. Odkazy na tato zobrazení jsou získány od držitele zobrazení přidruženého k recyklovanému zobrazení.

  5. Recyklované zobrazení se přidá do seznamu položek, RecyclerView které se chystáte přejít na obrazovku.

  6. Recyklované zobrazení přejde na obrazovku, když se uživatel posune RecyclerView k další položce v seznamu. Mezitím se další zobrazení posune mimo dohled a je recyklováno podle výše uvedených kroků.

Kromě opakovaného použití RecyclerView zobrazení položek používá také další optimalizaci efektivity: držitelé zobrazení. Držitel zobrazení je jednoduchá třída, která ukládá odkazy na zobrazení do mezipaměti. Pokaždé, když adaptér nafoukne soubor rozložení položek, vytvoří také odpovídajícího držitele zobrazení. Držitel zobrazení používá FindViewById k získání odkazů na zobrazení uvnitř nafoukaného souboru rozložení položek. Tyto odkazy se používají k načtení nových dat do zobrazení pokaždé, když je rozložení recyklováno, aby se zobrazila nová data.

Správce rozložení

Správce rozložení zodpovídá za umístění položek v RecyclerView zobrazení; určuje typ prezentace (seznam nebo mřížku), orientaci (jestli se položky zobrazují svisle nebo vodorovně) a které směrové položky se mají zobrazit (v normálním pořadí nebo v obráceném pořadí). Správce rozložení také zodpovídá za výpočet velikosti a umístění každé položky v zobrazení RecycleView .

Správce rozložení má další účel: určuje zásadu pro recyklaci zobrazení položek, která už nejsou uživateli viditelná. Vzhledem k tomu, že správce rozložení ví, která zobrazení jsou viditelná (a která nejsou), je nejvhodnější rozhodnout, kdy lze zobrazení recyklovat. Aby správce rozložení recykloval zobrazení, obvykle volá adaptér, aby nahradil obsah recyklovaného zobrazení různými daty, jak je popsáno výše v části Jak funguje recyklace zobrazení.

Můžete také vytvořit RecyclerView.LayoutManager vlastního správce rozložení nebo můžete použít předdefinovaného správce rozložení. RecyclerView poskytuje následující předdefinované správce rozložení:

  • LinearLayoutManager – Uspořádá položky ve sloupci, který lze posunout svisle, nebo v řádku, který lze posunout vodorovně.

  • GridLayoutManager – Zobrazí položky v mřížce.

  • StaggeredGridLayoutManager – Zobrazí položky v rozložené mřížce, kde některé položky mají různé výšky a šířky.

Pokud chcete určit správce rozložení, vytvořte instanci zvoleného správce rozložení a předejte ho metodě SetLayoutManager . Všimněte si, že musíte zadat správce rozložení – RecyclerView ve výchozím nastavení nevybírejte předdefinovaného správce rozložení.

Další informace o správci rozložení naleznete v části RecyclerView.LayoutManager třídy reference.

Držitel zobrazení

Držitel zobrazení je třída, kterou definujete pro odkazy zobrazení do mezipaměti. Adaptér používá tyto odkazy na zobrazení k vytvoření vazby každého zobrazení s jeho obsahem. Každá položka v objektu RecyclerView má přidruženou instanci držitele zobrazení, která ukládá odkazy na zobrazení pro danou položku. Chcete-li vytvořit držitele zobrazení, pomocí následujících kroků definujte třídu, která bude obsahovat přesnou sadu zobrazení pro každou položku:

  1. Podtřída RecyclerView.ViewHolder.
  2. Implementujte konstruktor, který vyhledá a uloží odkazy na zobrazení.
  3. Implementujte vlastnosti, které může adaptér použít pro přístup k těmto odkazům.

Podrobný příklad ViewHolder implementace je uveden v příkladu Základní RecyclerView. Další informace o RecyclerView.ViewHolder, viz RecyclerView.ViewHolder třídy reference.

Adaptér

Většina "náročného" RecyclerView kódu integrace se provádí v adaptéru. RecyclerView vyžaduje, abyste zadali adaptér odvozený z RecyclerView.Adapter přístupu ke zdroji dat a naplnili každou položku obsahem ze zdroje dat. Vzhledem k tomu, že zdroj dat je specifický pro aplikaci, musíte implementovat funkce adaptéru, které rozumí tomu, jak získat přístup k datům. Adaptér extrahuje informace ze zdroje dat a načte je do každé položky v kolekci RecyclerView .

Následující výkres ukazuje, jak adaptér mapuje obsah ve zdroji dat prostřednictvím držitelů zobrazení na jednotlivá zobrazení v každé položce řádku v:RecyclerView

Diagram illustrating Adapter connecting Data Source to ViewHolders

Adaptér načte každý RecyclerView řádek s daty pro určitou položku řádku. V případě umístění řádku P například adaptér vyhledá přidružená data na pozici P ve zdroji dat a zkopíruje tato data do položky řádku na pozici P v kolekci RecyclerView . Ve výše uvedeném výkresu například adaptér pomocí držáku zobrazení vyhledá odkazy na ImageView danou a TextView na této pozici, takže nemusí opakovaně volat FindViewById tato zobrazení, protože uživatel prochází kolekcí a opakovaně používá zobrazení.

Při implementaci adaptéru je nutné přepsat následující RecyclerView.Adapter metody:

  • OnCreateViewHolder – Vytvoří instanci souboru rozložení položky a držitele zobrazení.

  • OnBindViewHolder – Načte data na zadanou pozici do zobrazení, jejichž odkazy jsou uloženy v daném držiteli zobrazení.

  • ItemCount – Vrátí počet položek ve zdroji dat.

Správce rozložení volá tyto metody při umístění položek v rámci RecyclerView.

Upozorňování na změny dat v RecyclerView

RecyclerView neaktualizuje jeho zobrazení automaticky, když se obsah jeho zdroje dat změní; adaptér musí informovat RecyclerView , když dojde ke změně datové sady. Datová sada se může měnit mnoha způsoby; Například obsah v rámci položky může změnit nebo může být změněna celková struktura dat. RecyclerView.Adapter poskytuje řadu metod, které můžete volat, aby RecyclerView reagovaly na změny dat nejúčinnějším způsobem:

  • NotifyItemChanged – Signalizuje, že se položka na zadané pozici změnila.

  • NotifyItemRangeChanged – Signály, že se změnily položky v zadaném rozsahu pozic.

  • NotifyItemInserted – Signály, že položka v zadané pozici byla nově vložena.

  • NotifyItemRangeInserted – Signály, že položky v zadaném rozsahu pozic byly nově vloženy.

  • NotifyItemRemoved – Signály, že položka v zadané pozici byla odebrána.

  • NotifyItemRangeRemoved – Signály, že položky v zadaném rozsahu pozic byly odebrány.

  • NotifyDataSetChanged – Signály, že se datová sada změnila (vynutí úplnou aktualizaci).

Pokud přesně víte, jak se vaše datová sada změnila, můžete volat výše uvedené metody, které se RecyclerView mají aktualizovat nejúčinnějším způsobem. Pokud nevíte přesně, jak se sada dat změnila, můžete volat NotifyDataSetChanged, což je mnohem méně efektivní, protože RecyclerView musí aktualizovat všechna zobrazení, která jsou viditelná uživateli. Další informace o těchtometodch

V dalším tématu je příklad základního recyclerView implementovaná ukázková aplikace, která demonstruje skutečné příklady kódu částí a funkcí uvedených výše.