21

Czy mógłbyś wytłumaczyć metodę .Wyjaśnienie metody getView() dla ArrayAdaptera

Czytam docs i ma trzy parametry:

  • position: pozycja elementu w danych adaptera zestaw element, którego widok chcemy.
  • convertView: Stary widok do ponownego użycia, jeśli to możliwe. Uwaga: Przed użyciem należy sprawdzić, czy ten widok ma wartość inną niż null i odpowiedniego typu. Jeśli nie można przekonwertować tego widoku, aby wyświetlić prawidłowe dane, ta metoda może utworzyć nowy widok.
    Niejednorodne listy mogą określać ich liczbę typów widoków, aby ten widok był zawsze prawidłowy (zobacz getViewTypeCount() i getItemViewType (int)).
  • parent: Takie, że widok zostanie ostatecznie zamocowany do

I rozumieć parametr position. Tak jak powiedzieli, to oznacza pozycję przedmiotu, o którego opinię zwrócono się.

Skąd pochodzi convertView. Widziałem wiele przykładów, gdzie sprawdzają, czy convertView ma wartość null. Jeśli ma wartość NULL, nadyma nową instancję układu wierszy, wypełnia ją i zwraca. Sądzę, że też to zrozumiałem, ale jedna rzecz wciąż mnie niepokoi. Jaki jest układ, który jest przekazywany za pomocą parametru convertView. Czy jest to the resource parameter that is passed in when initialising the ArrayAdapter? Czy jest to kopia w pamięci podręcznej ostatniego układu zwróconego przez getView()?

I na koniec. Do czego służy parametr parent. Nie widziałem zbyt wielu przykładów wykorzystujących to. Większość z nich po prostu ponownie wykorzystuje/nadpisuje układ wierszy i zwraca go.

(Pytam bo mam animację na kliknięcie w moim ListView. Konkretnie this one that aims to replicate Spotify's dropdown quick action menu. Moja animacja jest trochę powolny. Po zdiagnozowaniu tego problemu na chwilę, zdałem sobie sprawę, że było to spowodowane fakt, że moja metoda getView() zajmuje trochę czasu, aby zakończyć, ponieważ nadpisuję nowy układ wierszy w każdej iteracji. Ktoś zasugerował buforowanie układu wierszy w ViewHolder, podczas gdy inne przykłady wskazują na ponowne użycie parametru convertView, tj. tylko nadanie kształtu wierszowi jeśli convertView ma wartość null.)

Odpowiedz

44

Czy jest to kopia w pamięci podręcznej ostatniego układu zwróconego przez getView()?

convertView jest widokiem z rzędu, lewy obraz (a więc nie jest ostatnim widok zwrócone metodą getView). Na przykład najpierw pokazano listę, w tym przypadku convertView jest null, poprzednio nie utworzono widoku wiersza i opuściliśmy ekran. Jeśli przewiniesz w dół, wiersz 0 opuści ekran (nie będzie już widoczny), gdy tak się stanie, ListView może zachować ten widok w pamięci podręcznej, aby móc go później użyć (to ma sens, ponieważ wiersze z ListView ogólnie mają ten sam układ, w którym tylko dane są różne). Powodem utrzymania niektórych widoków w pamięci podręcznej i późniejszego ich użycia jest to, że metoda getView może być wywoływana wiele razy (za każdym razem, gdy użytkownik przewija w górę/w dół, a na ekranie pojawiają się nowe wiersze). Gdyby za każdym razem trzeba było odtworzyć widok wiersza, spowodowałoby to powstanie wielu obiektów, których należy unikać.W swojej metodzie getView można sprawdzić, czy jest to convertView, czy jest to null. Jeśli jest to null, musisz musi zbudować nowy widok wiersza i wypełnić go danymi, jeśli to nie jest null, zaoferował ci poprzedni widok. Posiadanie tego poprzedniego widoku oznacza, że ​​nie musisz budować nowego układu wierszy, zamiast tego musisz podać zapełnić go poprawnymi danymi, ponieważ ten widok w pamięci podręcznej nadal zawiera stare dane (zobaczyłbyś wiele pytań na temat stackoverflow, gdzie użytkownicy pytają, dlaczego wiersze ich ListView są duplikowane, gdy przewijają w dół).

Do czego służy parametr nadrzędny. Nie widziałem zbyt wielu przykładów przy użyciu tego. Większość z nich po prostu ponownie wykorzystuje/nadpisuje układ wierszy i zwraca go.

Należy użyć tego, aby uzyskać prawidłowy LayoutParams dla nowo napompowanego/zbudowanego rzędu. Na przykład, jeśli nadpisujesz układ, który ma katalog RelativeLayout jako root i nie używasz parent, aby uzyskać LayoutParams, możesz mieć problemy z układem wiersza. Aby wziąć rodzica w zamian należałoby użyć:

convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false); 
+3

To naprawdę fajna odpowiedź! – Tarik

+0

najlepsza odpowiedź tnx –

2

Moje rozumienie convertView jest to, że w zasadzie poglądy, które zostały poddane recyklingowi, ponieważ nie są one wykorzystywane w tej chwili - na przykład przewijać listę w dół, te na górze nie znajdują się na ekranie, więc przechodzą do tego parametru, aby móc go użyć, gdy potrzebujesz nowego widoku (nie musisz więc tworzyć zupełnie nowego, gdy nieużywane osoby siedzą bezczynnie). iOS ma podobną metodę o nazwie dequeueReusableCellWithIdentifier. Jeśli każdy wiersz widoku listy ma taką samą strukturę, można bezpiecznie przesłać go do odpowiedniego typu i po prostu zaktualizować zawarte w nim informacje - tekst, obrazy itp. Będzie to widok, który został wcześniej zwrócony przez wywołanie getView() tego samego. lista.

Moje najlepsze przypuszczenie (i to jest z pewnością domysły) z parent jest to, że jest to widok, że lista tego adaptera jest dzieckiem. Daje ci trasę do systemu renderowania, jeśli potrzebujesz kontekstu, dostępu do systemu zasobów, aby przekazywać informacje do lub otrzymywać informacje z widoku nadrzędnego listy.