Czy ktoś może prostymi słowami wyjaśnić mi zastosowanie getViewTypeCount()
i getItemViewType()
metody ArrayAdapter
?
Obsługują one przypadek, w którym potrzebujesz różnych typów widoków dla różnych wierszy. Na przykład w aplikacji do obsługi kontaktów możesz chcieć, aby parzyste wiersze miały obrazy po lewej stronie, a nieparzyste wiersze miały obrazy po prawej. W takim przypadku użyłbyś:
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
return position % 2;
}
Struktura używa Twojego typu widoku, aby zdecydować, które widoki przekazać convertView
w Twojej getView
metodzie . Innymi słowy, w powyższym przykładzie wiersze parzyste otrzymają tylko widoki z recyklingu ze zdjęciami po lewej stronie do ponownego wykorzystania, a wiersze nieparzyste otrzymają tylko te ze zdjęciami po prawej stronie.
Jeśli każdy wiersz na liście ma ten sam układ, nie musisz się martwić o typy widoków. W rzeczywistości BaseAdapter.java zapewnia domyślne zachowanie dla wszystkich adapterów:
public int getItemViewType(int position) {
return 0;
}
public int getViewTypeCount() {
return 1;
}
To rzeczywiście zapewnia ten sam typ widoku dla każdego wiersza.
Edytuj - aby zarysować ogólny przepływ:
AdapterView
za pomocą adaptera.AdapterView
próbuje wyświetlić elementy, które są widoczne dla użytkownika.getItemViewType
wiersz n
, wiersz, który ma zostać wyświetlony.n
. Nie znajduje żadnego, ponieważ żadne widoki nie zostały jeszcze przetworzone.getView
jest wezwany do wiersza n
.getItemViewType
wiersz, n
aby określić, jakiego typu widoku należy użyć.getView
, a widok Twojego wiersza jest wyświetlany użytkownikowi.Teraz, gdy widok jest odtwarzany przez przewijanie ekranu, trafia do puli widoków odtworzonych, zarządzanej przez platformę. Są one zasadniczo uporządkowane według typu widoku, dzięki czemu w convertView
parametrze getView
metody otrzymujesz widok odpowiedniego typu :
getItemViewType
wiersz, który chce wyświetlić.convertView
parametr do getView
metody.
Jeśli musimy pokazać inny typ widoku w widoku listy, to jest dobry w użyciu
getViewTypeCount()
igetItemViewType()
w adapterze zamiast przełączania widokuView.GONE
iView.VISIBLE
może być bardzo kosztownym zadaniem,getView()
które wpłynie na przewijanie listy.Sprawdź, czy używasz adaptera
getViewTypeCount()
igetItemViewType()
w nim.Link: the-use-of-getviewtypecount
źródło
Oglądaj Outttt !!!!
Musiałem zmierzyć się z problemem z implementacją
ListView
wczoraj i dwa rodzaje widoków wierszy pomieszały się zaraz po przewinięciu. Mimo, że najwyżej głosowana odpowiedź w tym wątku daje dobre ogólne wyjaśnienie, nie podkreśliła najważniejszej informacji, aby zatrzymać powyższy błąd interfejsu użytkownika, o którym wspomniałem.Oto moje wyjaśnienie:
Obie
getViewTypeCount()
igetItemViewType()
są wykorzystywane przezBaseAdapter
„sgetView
metoda, aby dowiedzieć się, jaki rodzaj widoku należy pobrać, ekologiczny i wrócił. (jak wyjaśniono w pierwszej odpowiedzi w wątku). Ale jeśli nie zaimplementujesz tych dwóch metod intuicyjnie zgodnie z Android API Doc, możesz dostać się do problemu, o którym wspomniałem.Podsumowanie wytycznych dotyczących implementacji:
Aby zaimplementować wiele typów wierszy
Views
forListView
, musimy zasadniczo zaimplementowaćgetItemViewType()
igetViewTypeCount()
metody. IgetItemViewType()
dokumentacja daje nam uwaga co następuje:Więc w swoim
getItemViewType()
powinieneś zwrócić wartości dla typu widoku, zaczynając od 0, do ostatniego typu as (liczba typów - 1). Na przykład, powiedzmy, że masz tylko trzy rodzaje widoków? Tak więc w zależności od obiektu danych dla widoku, można zwrócić tylko 0 lub 1 lub 2, odgetItemViewType()
sposobu, jak indeks tablicy zera. Ponieważ masz używane trzy typy widoków, TwojagetViewTypeCount()
metoda musi zwracać 3.W każdym razie, jeśli zwrócisz jakiekolwiek inne wartości całkowite, takie jak 1, 2, 3 lub 111, 222, 333 dla tej metody, na pewno możesz napotkać powyższy błąd interfejsu użytkownika, który właśnie umieściłeś, nie przestrzegając dokumentacji Android API.
Jeśli nie dostałeś wskazówki lub nadal nie możesz rozwiązać problemu i potrzebujesz dalszych informacji, przeczytaj moją szczegółową odpowiedź w tym wątku pytań i odpowiedzi StackOverflow .
Przeczytaj dokumentację dla programistów Androida, aby uzyskać więcej informacji, możesz znaleźć wskazówkę bezpośrednio.
Mam nadzieję, że ta odpowiedź może pomóc komuś zaoszczędzić wiele godzin !!!
Twoje zdrowie!!!
źródło
IGNORE_ITEM_VIEW_TYPE
że mam błąd w jednym z moich ListView. Użyłem ArrayAdapter, aby wstawić widok składający się z 1 obrazu i 2 widoku tekstu. Miałem tylko jeden typ widoku. Próbowałem albo nie zastąpić metody getItemViewType, albo zastąpić ją, zwracając pozycję lub zakodowaną na stałe liczbę całkowitą. We wszystkich przypadkach na mojej liście występowały duplikaty, z dziwnym zachowaniem podczas przewijania (duplikaty zmian). PowrótIGNORE_ITEM_VIEW_TYPE
do metody rozwiązał problem. Dzięki.