Dla aplikacji, nad którą pracuję, staram się pozyskać dzieci z ListView. Aby to zrobić, mam następujący kod:Uzyskaj listę dzieci, których nie ma w widoku
View listItem = mListView.getChildAt(i);
Jednak działa to tylko dla dzieci, które są w zasięgu wzroku. Muszę również dotrzeć do dzieci, które nie są w zasięgu wzroku. Jak to zrobić?
EDIT:
Porównując proponowane metody do tego, że już przy użyciu znaleźć następujące:
RelativeLayout listItem1 = (RelativeLayout) mListView.getAdapter().getView(i, null, mListView);
RelativeLayout listItem2 = (RelativeLayout) mListView.getChildAt(i);
Log.d("Checks", "listItem1: " + listItem1);
Log.d("Checks", "listItem2: " + listItem2);
08-27 14:16:56.628: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.628: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.628: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.628: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.638: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.638: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.638: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.638: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.648: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.648: D/Checks(15025): listItem2: [email protected]
08-27 14:16:56.648: D/Checks(15025): listItem1: [email protected]
08-27 14:16:56.648: D/Checks(15025): listItem2: [email protected]
punktów listItem2 do rzeczywistego widoku w ListView, który jest to, co chcę z tym wyjątkiem, że działa tylko w Widoku, który jest widoczny. Z pliku dziennika widać, że elementy listItem1 i listItem2 nie odpowiadają.
EDIT 2:
wymyśliłem następujące:
for (int i = 0; i < mListView.getCount(); i++) {
RelativeLayout listItem = (RelativeLayout) mListView.getAdapter().getView(i, mListView.getChildAt(i), mListView);
}
ta zwraca widoków poprawnie dla wszystkich widocznych elementów na liście. Jednakże zwraca inny widok dla tych, których nie widać.
EDIT 3:
Dzięki nfirex mam odpowiedź roboczą. Będzie to powrót wyświetleń, nawet jeśli nie są one bezpośrednio w zasięgu wzroku:
public View getViewByPosition(int position, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (position < firstListItemPosition || position > lastListItemPosition) {
return listView.getAdapter().getView(position, listView.getChildAt(position), listView);
} else {
final int childIndex = position - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
To rzeczywiście zwraca widok. Jednak myślę, że zwraca nowy widok zamiast tego, który chcę. – Zero
@ Zero Który widok potrzebujesz odzyskać? Metoda ListView.getChildAt (i) zwróci to dziecko (jest to metoda ViewGroup), która została wcześniej pobrana z adaptera. Adapter.getView (pos, oldView, parent) zwróci nowy widok (jeśli oldView == null) lub oldView z danymi zawartymi w Adapter.getItem (pos) według pozycji elementu na liście danych. Chcesz otrzymywać widoki, które również są przechowywane w indeksie ListView według indeksu? – nfirex
Próbuję uzyskać widok, który otrzymuję również z getChildAt (i), ale dla widoków, które nie są widoczne (jeśli mam 8 elementów na ekranie i żądam getChildAt (10), które będą tam, gdy przewijam w dół, dostaję NullPointerException) – Zero