Součásti a funkce RecyclerView

RecyclerView zpracovává některé úlohy interně (například posouvání a recyklaci zobrazení), ale v podstatě jde o správce, který koordinuje třídy pomocných prvků k zobrazení kolekce. RecyclerView deleguje úlohy na následující pomocné třídy:

  • Adapter – Nafoukne rozložení položek (vytvoří instanci obsahu souboru rozložení) a sváže data se zobrazeními zobrazenými v rámci 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 a spravuje RecyclerView zásady pro zobrazení recyklace.

  • ViewHolder – Vyhledá a uloží odkazy zobrazení. Držitel zobrazení také pomáhá detekovat kliknutí na zobrazení položek.

  • ItemDecoration – Umožňuje aplikaci přidat speciální posuny kreslení a rozložení ke konkrétním zobrazením pro kreslení rozdělovačů mezi položkami, zvýrazněními a ohraničeními vizuálního seskupení.

  • ItemAnimator – Definuje animace, které se prochytá při akcích položek nebo při změnách adaptéru.

Vztah mezi třídami , a RecyclerView je znázorněn v následujícím LayoutManagerAdapter diagramu:

Diagram RecyclerView obsahujícího LayoutManager s použitím adaptéru pro přístup k datové sadě

Jak je znázorněno na tomto obrázku, lze si to myslít jako prostředník mezi a LayoutManagerAdapterRecyclerView . Provádí LayoutManager volání metod jménem AdapterRecyclerView . Například volá metodu, když je čas vytvořit nové zobrazení pro konkrétní pozici LayoutManagerAdapter položky v RecyclerView . Nafoukne rozložení pro tuto položku a vytvoří instanci (není zobrazena), která bude ukládat odkazy na Adapter zobrazení na této pozici do ViewHolder mezipaměti. Když volá metodu , která vytvoří vazbu konkrétní položky k datové sadě, vyhledá data pro tuto položku, načte je z datové sady a zkopíruje je do zobrazení přidružené LayoutManagerAdapterAdapter položky.

Při použití v aplikaci se vyžaduje vytvoření odvozených typů RecyclerView následujících tříd:

  • RecyclerView.Adapter – Poskytuje vazbu z datové sady vaší aplikace (která je specifická pro vaši aplikaci) se zobrazeními položek zobrazenými v rámci RecyclerView . Adaptér ví, jak přidružit každou pozici zobrazení položky v k RecyclerView určitému umístění ve zdroji dat. Adaptér navíc zpracovává rozložení obsahu v rámci jednotlivých zobrazení položek a vytváří pro každé zobrazení držitel 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žek, aby se vyhledávání prostředků zbytečně neopakovala. Držitel zobrazení také zajistí, aby se události kliknutí na položku přeposlaly adaptéru, když uživatel klepne na zobrazení přidružené 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ásady rozložení na správce rozložení, takže můžete připojit jiného správce rozložení bez nutnosti provádět významné změny v aplikaci.

Můžete také volitelně rozšířit následující třídy a změnit tak vzhled a vzhled RecyclerView aplikace:

  • RecyclerView.ItemDecoration
  • RecyclerView.ItemAnimator

Pokud rozšiřovat a ItemDecorationItemAnimator , použije výchozí RecyclerView implementace. Tato příručka nevysvětluje, jak vytvářet vlastní třídy a . Další informace o těchto třídách najdete v tématu ItemDecorationItemAnimatorItemDecoration a ItemAnimator

Jak funguje recyklace zobrazení

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

Diagram znázorňující šest kroků recyklace zobrazení

  1. Když se zobrazení posune mimo dohled a už se nezobrazuje, stane se zobrazením scrapu.

  2. Zobrazení scrapu se umístí do fondu a stane se recyklačním zobrazením. Tento fond je mezipaměť zobrazení, která zobrazují stejný typ dat.

  3. Když se má zobrazit nová položka, zobrazí se z recyklovaného fondu, aby se bylo možné znovu použít. Vzhledem k tomu, že toto zobrazení musí být před zobrazením znovu vázáno adaptérem, nazývá se ho nečtené zobrazení.

  4. Nečtené zobrazení je recyklované: Adaptér vyhledá data pro další položku, která se má zobrazit, a zkopíruje tato data do zobrazení pro tuto položku. Odkazy na tato zobrazení se načítá z držitele zobrazení přidruženého k recyklovanému zobrazení.

  5. Recyklované zobrazení se přidá do seznamu položek v , které se chytou RecyclerView na obrazovce.

  6. Recyklované zobrazení se zobrazí na obrazovce, když uživatel přejde na RecyclerView další položku v seznamu. Mezitím se další zobrazení posune mimo dohled a recykluje se podle výše uvedených kroků.

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

Správce rozložení

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

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

Rozšířením RecyclerView.LayoutManager můžete vytvořit 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 posouvat svisle nebo na řádku, který lze posouvat 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 SetLayoutManager metodě . Všimněte si, že musíte zadat správce rozložení – ve výchozím nastavení nevyberou předdefinovaného správce rozložení.

Další informace o správci rozložení najdete v referenčních informacích ke třídě RecyclerView.LayoutManager.

Držitel zobrazení

Držitel zobrazení je třída, kterou definujete pro odkazy zobrazení ukládání do mezipaměti. Adaptér používá tyto odkazy na zobrazení k vytvoření vazby každého zobrazení ke svému obsahu. Každá položka v objektu má přidruženou instanci vlastníka zobrazení, která ukládá odkazy na zobrazení pro tuto RecyclerView položku do mezipaměti. Pokud chcete vytvořit držitele zobrazení, pomocí následujícího postupu 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 implementace je ViewHolder uveden v ViewHolder. Další informace o najdete RecyclerView.ViewHolder v referenčních informacích ke RecyclerView.ViewHolder

Adaptér

Většina "náročné práce" integračního kódu se RecyclerView odehrá v adaptéru. RecyclerView vyžaduje, abyste pro přístup ke zdroji dat poskytovali adaptér odvozený od a doplňujete každou položku RecyclerView.Adapter obsahem ze zdroje dat. Vzhledem k tomu, že zdroj dat je specifický pro aplikaci, musíte implementovat funkci adaptéru, která rozumí přístupu k datům. Adaptér extrahuje informace ze zdroje dat a načte je do každé položky v RecyclerView kolekci.

Následující obrázek znázorňuje, 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 ilustrující adaptér připojující zdroj dat k držitelům zobrazení

Adaptér načte každý RecyclerView řádek s daty pro konkrétní položku řádku. Například pro pozici řádku Padapté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. Ve výše uvedeném výkresu například adaptér používá držitel zobrazení k vyhledávání odkazů na objekt a na této pozici, takže nemusí tato zobrazení opakovaně volat, když uživatel prochází kolekcí a znovu používá ImageViewTextViewFindViewById 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 zadané 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 .

Oznamování recyklátoruZobrazení změn dat

RecyclerView při změně obsahu zdroje dat automaticky ne aktualizuje zobrazení. Adaptér musí upozornit RecyclerView na změnu datové sady. Datová sada se může měnit mnoha způsoby. Například obsah v rámci položky se může změnit nebo se může změnit celková struktura dat. RecyclerView.Adapter poskytuje řadu metod, které můžete volat, aby co nejefektivněji reagovaly na RecyclerView změny dat:

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

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

  • NotifyItemInserted – Signalizuje, že položka na zadané pozici byla nově vložena.

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

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

  • NotifyItemRangeRemoved – Signalizuje odebrání položek v zadaném rozsahu pozic.

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

Pokud přesně víte, jak se vaše datová sada změnila, můžete zavolat výše uvedené vhodné metody, aby se aktualizovaly nejúčinnějším RecyclerView způsobem. Pokud přesně nevíte, jak se vaše datová sada změnila, můžete zavolat NotifyDataSetChanged , což je mnohem méně efektivní, protože RecyclerView musí aktualizovat všechna zobrazení, která jsou viditelná pro uživatele. Další informace o těchto metodách naleznete v tématu RecyclerView. Adapter.

V dalším tématu je k DisRecyclerView například základní příkladaplikace, který předvádí příklady skutečných kódů částí a funkcí uvedených výše.