Odpowiedzi:
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ć convertVieww Twojej getViewmetodzie . 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:
AdapterViewza pomocą adaptera.AdapterViewpróbuje wyświetlić elementy, które są widoczne dla użytkownika.getItemViewTypewiersz n, wiersz, który ma zostać wyświetlony.n. Nie znajduje żadnego, ponieważ żadne widoki nie zostały jeszcze przetworzone.getViewjest wezwany do wiersza n.getItemViewTypewiersz, naby 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 convertViewparametrze getViewmetody otrzymujesz widok odpowiedniego typu :
getItemViewTypewiersz, który chce wyświetlić.convertViewparametr do getViewmetody.Jeśli musimy pokazać inny typ widoku w widoku listy, to jest dobry w użyciu getViewTypeCount()i getItemViewType()w adapterze zamiast przełączania widoku View.GONEi View.VISIBLEmoże być bardzo kosztownym zadaniem, getView()które wpłynie na przewijanie listy.
Sprawdź, czy używasz adaptera getViewTypeCount()i getItemViewType()w nim.
Oglądaj Outttt !!!!
Musiałem zmierzyć się z problemem z implementacją ListViewwczoraj 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()i getItemViewType()są wykorzystywane przez BaseAdapter„s getViewmetoda, 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 Viewsfor ListView, musimy zasadniczo zaimplementować getItemViewType()i getViewTypeCount()metody. I getItemViewType()dokumentacja daje nam uwaga co następuje:
Uwaga: liczby całkowite muszą mieścić się w zakresie
0dogetViewTypeCount() - 1.IGNORE_ITEM_VIEW_TYPEmożna również zwrócić.
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, od getItemViewType()sposobu, jak indeks tablicy zera. Ponieważ masz używane trzy typy widoków, Twoja getViewTypeCount()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!!!
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ót IGNORE_ITEM_VIEW_TYPEdo metody rozwiązał problem. Dzięki.