Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android

Android od podstaw: omówienie adapterów i widoków adapterów

by
Difficulty:BeginnerLength:MediumLanguages:
This post is part of a series called Android From Scratch.
Android From Scratch: Connecting Activities and Applications
Android From Scratch: How to Use Resources In an Application

Polish (Polski) translation by Mateusz Kurlit (you can also view the original English article)

Widoki adapterów są wszechobecne do tego stopnia, że trudno znaleźć popularną aplikację, która z nich nie korzysta. Nazwa może wydawać się całkowicie obca, ale jeśli myślisz, że nigdy nie widziałeś widoku adaptera, prawdopodobnie się mylisz. Za każdym razem, gdy aplikacja wyświetla elementy interfejsu użytkownika w formie listy, siatki lub stosu, widzisz widok adaptera w akcji.

Widok adaptera, jak sama nazwa wskazuje, jest obiektem View. Oznacza to, że możesz dodać go dodać do aktywności w ten sam sposób co inne widżety interfejsu użytkownika. Jednakże, nie jest w stanie samodzielnie wyświetlać żadnych danych. Jego zawartość jest zawsze określona przez inny obiekt, adapter. W tym poradniku pokażę ci jak tworzyć adaptery i używać ich, aby wypełniać różne rodzaje widoków adapterów takie jak ListView i GridView.

Łatwiej uczysz się za pomocą wideo? Obejrzyj nasz kurs:

1. Co to jest adapter?

Adapter jest obiektem klasy, która implementuje interfejs Adapter. Działa jako połączenie między zestawem danych i widokiem adaptera, obiektem klasy, która rozszerza abstrakcyjną klasę AdapterView. Zestaw danych może być wszystkim, co reprezentuje dane w zorganizowany sposób. Tablice, obiekty List i Cursor są powszechnie używanymi zestawami danych.

Adapter jest odpowiedzialny za pobieranie danych z zestawu i generowanie obiektów View opartych o te dane. Wygenerowane obiekty View są następnie wykorzystywane do zamieszczania widoku adaptera przywiązanego do adaptera.

Możesz tworzyć własne klasy adapterów od podstaw, ale większość deweloperów wybierają rozszerzenie klas adapterów dostarczanych przez Android SDK takich jak ArrayAdapter i SimpleCursorAdapter. W tym poradniku skupimy się na klasie ArrayAdapter.

2. Jak działają widoki adapterów?

Widoki adapterów mogą bardzo wydajnie wyświetlać duże zestawy danych. Na przykład, widżety ListView i GridView mogą wyświetlać miliony elementów bez żadnego opóźnienia przy zachowaniu niskiego zużycia pamięci i procesora. Jak to robią? Różne widoki adapterów kierują się rożnymi strategiami. Jednakże, oto co większość z nich zazwyczaj robi.

  • Renderują tylko te obiekty View, które albo znajdują się na ekranie albo mają być przeniesione na ekran. W ten sposób pamięć zużyta przez widok adaptera może być stała i niezależna od rozmiaru zestawu danych.
  • Pozwalają również deweloperom zminimalizować kosztowne operacje wypełnienia układu i recyklingu istniejących obiektów View, które zostały przeniesione poza ekran. To również utrzymuje niskie zużycie procesora.

3. Tworzenie ArrayAdapter

Aby utworzyć adapter, potrzebujesz:

  • zestaw danych
  • plik zasobów zawierający układ wygenerowanych obiektów View

Dodatkowo, ponieważ klasa ArrayAdapter może tylko pracować z więzami, musisz upewnić się, że układ wygenerowanych obiektów View zawiera przynajmniej jeden widżet TextView.

Krok 1: Utwórz zestaw danych

Klasa ArrayAdapter może jako zestawy danych wykorzystywać tablice i obiekty List. W tej chwili, jako zestawu danych użyjmy tablicy.

Krok 2: Utwórz plik zasobów

Utwórz nowy plik XML układu, którego elementem głównym jest LinearLayout i nazwij go item.xml. Umieść w nim widżet Large text i ustaw wartość atrybutu id na cheese_name. Plik XML układu powinien wyglądać tak:

Krok 3: Utwórz adapter

W aktywności utwórz nową instancję klasy ArrayAdapter za pomocą jego konstruktora. Jako argument, podaj nazwę pliku zasobów, identyfikator TextView i odniesienie do tablicy. Adapter jest już gotowy.

4. Tworzenie listy

Aby wyświetlić pionowo przewijalne elementy listy, możesz użyć widżetu ListView. Aby dodać widżet do aktywności, możesz go przenieść i upuścić w pliku XML układu aktywności lub utworzyć jego konstruktora w kodzie Java. Na tę chwilę, wybierzmy drugą opcję.

Zazwyczaj w układzie, który zawiera ListView nie znajdują się inne widżety interfejsu użytkownika. Dlatego przekaż ListView do metody setContentView() twojej aktywności, aby zajął cały ekran.

Aby powiązać ListView z adapterem utworzonym w poprzednim kroku, wezwij metodę setAdapter() jak pokazano poniżej.

Jeśli uruchomisz teraz swoją aplikację, powinieneś widzieć zawartość tablicy w formie listy. 

ListView With ArrayAdapter

5. Tworzenie siatki

Aby wyświetlić pionowo przewijalną dwuwymiarową siatkę elementów, możesz użyć widżetu GridView. ListView i GridView są podklasami abstrakcyjnej klasy AbsListView i posiadają wiele wspólnych cech. W związku z tym, jeśli wiesz jak użyć jednego, wiesz również jak wykorzystać pozostałe.

Skorzystaj z konstruktora klasy GridView, aby utworzyć nową instancję i przekaż ją do metody setContenView() twojej aktywności.

Aby ustawić liczbę kolumn siatki, wezwij metodę setNumColumns(). Stwórzmy więc dwukolumnową siatkę.

Możesz dostosować szerokość kolumn i odstępy między nimi za pomocą metod setColumnWidth(), setVerticalSpacing() i setHorizontalSpacing() Zwróć uwagę, że jednostki tych metod to piksele.

Możesz teraz powiązać GridView z adapterem utworzonym wcześniej za pomocą metody setAdapter().

Uruchom ponownie swoją aplikację, aby zobaczyć jak teraz wygląda GridView.

GridView With ArrayAdapter

6. Dodawanie słuchania wydarzeń

Istnieje możliwość słuchania krótkich i długich kliknięć elementów w widoku adaptera. Jako przykład, dodajmy słuchanie kliknięcia do GridView.

Utwórz nową instancję anonimowej klasy, która implementuje interfejs AdapterView.OnItemClickListener i przekazuje go do metody setOnItemClickListener() obiektu GridView. Android Studio automatycznie generuje fragment metody onItemClick() interfejsu. Zwróć uwagę, że parametry metody zawierają liczbę całkowitą określającą pozycję elementu listy. Możesz użyć tej liczby, aby dowiedzieć się, który element w zestawie danych kliknął użytkownik.

Poniższy kod ilustruje jak wyświetlić proste wiadomości za każdym razem, gdy kliknięty zostanie element w GridView.

Jeśli uruchomisz aplikację i klikniesz dowolny element na siatce, na dole ekranu pojawi się wiadomość. Zwróć uwagę, że możesz wykorzystać ten sam kod, aby słuchać kliknięć elementów w ListView.

Snackbar Shown When Items Are Clicked

7. Rozszerzanie ArrayAdapter

ArrayAdapter potrafi obsługiwać tylko jeden widżet TextView w układzie obiektów View, które generuje. Aby dodać nowe możliwości, musisz go rozszerzyć. Zanim to wykonamy, utwórzmy nieco bardziej złożony zestaw danych.

Zamiast więzów, powiedzmy, że nasz zestaw danych zawiera obiekty klasy poniżej:

Oto jaki zestaw danych wykorzystamy:

Jak widzisz, klasa Cheese zawiera dwa pola, name i description. Aby wyświetlić oba pola na liście lub siatce, układ elementów musi zawierać dwa widżety TextView.

Utwórz nowy plik XML układu i nazwij go custom_item.xml. Dodaj do niego widżety Large text i Small text. Ustaw atrybut id pierwszego widżetu na cheese_name i drugiego na cheese_description. Plik XML układu powinien teraz wyglądać tak:

ArrayAdapter musi również być zdolny do obsługi dwóch widżetów TextView. Przejdź do aktywności, utwórz nową anonimową klasę, która rozszerza ArrayAdapter, i nadpisuje metodę getView(). Upewnij się, że przekazujesz tablicę jako argument do jej konstruktora.

Wewnątrz metody getView(), musisz użyć parametru position jako indeksu tablicy i pobrać element z tego indeksu.

Drugim parametrem metody getView() jest umożliwienie ponownego użycia obiektów View. Jeśli go zignorujesz, wydajność twojego widoku adaptera będzie niska. Kiedy metoda getView() jest wzywana po raz pierwszy, convertView wynosi null. Musisz ją zainicjować wypełniając plik zasobów, który określa układ elementów listy. Aby to zrobić, uzyskaj odwołanie do LayoutInflater za pomocą metody getLayoutInflater() i wywołaj metodę inflate().

W tym miejscu możesz użyć findViewById(), aby uzyskać odniesienie do widżetów TextView wewnątrz układu i wezwać ich metody setText(), aby zainicjować je za pomocą danych z tablicy.

Dodaj return convertView, abyś mógł użyć go do wypełnienia dowolnego widoku adaptera powiązanego z adapterem.

8. Wykorzystanie uchwytu widoku

Metoda getView() jest wzywana wielokrotnie przez widok adaptera, aby go wypełnić. W związku z tym, spróbujmy zminimalizować liczbę przeprowadzanych operacji.

W poprzednim kroku mogłeś zauważyć, że nawet jeśli ustawiliśmy jednorazowe wypełnianie układu elementów listy, metoda findViewById(), które pochłania wiele cyklów procesora, jest wzywana za każdym razem, gdy wzywana jest metoda getView().

Aby tego uniknąć i poprawić wydajność widoku adaptera, musimy przechować rezultaty metody findViewById() wewnątrz obiektu convertView. Użyjmy do tego obiektu view holder, który nie jest niczym więcej niż obiektem klasy, która potrafi przechowywać widżety obecne w układzie.

Ponieważ układ posiada dwa widżety TextView, klasa uchwytu widoku musi również zawierać dwa widżety TextView. Nazwałem klasę ViewHolder.

W metodzie getView(), po wypełnieniu układu, możesz zainicjować obiekt uchwytu widoku za pomocą metody findViewById().

Aby przechować obiekt uchwytu widoku w convertView, użyj jego metody setTag().

Za każdym razem, gdy getView() jest wzywana, możesz pobrać obiekt uchwytu widoku z convertView za pomocą metody getTag() i zaktualizować widżety TextView za pomocą ich metod setText().

Jeśli teraz uruchomisz swoją aplikację, możesz zobaczyć GridView wyświetlający dwa wiersze tekstu w każdej komórce.

GridView with two lines of text per item

Podsumowanie

W tym poradniku, dowiedziałeś się jak stworzyć adapter i wykorzystać go do wypełnienie różnych widoków adapterów. Nauczyłeś się również jak stworzyć własny niestandardowy adapter. Chociaż skupiliśmy się tylko na klasach ArrayAdapter, ListView i GridView, możesz użyć tej samej techniki do stworzenia innych adapterów i widoków adapterów oferowanych przez Android SDK.

Biblioteka wsparcia Android zawiera klasę RecyclerView. Zachowuje się ona jak widok adaptera, ale nie jest podklasą klasy AdapterView. Powinieneś rozważyć jej użycie, jeśli chcesz stworzyć bardziej złożone listy, szczególnie takie wykorzystujące wiele plików układu dla ich elementów. Aby dowiedzieć się więcej, przeczytaj ten poradnik na Envato Tuts+.

Aby dowiedzieć się więcej o klasie AdapterView i jej podklasach, zapoznaj się z tą dokumentacją.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.