2013-08-27 11 views
17

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); 
    } 
} 

Odpowiedz

33

Trzeba metodę Adapter.getView():

final View view = mListView.getAdapter().getView(position, null, mListView); 

UPDATE:

Musisz stworzyć swoją metodę. Coś takiego:

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, null, listView); 
    } else { 
     final int childIndex = position - firstListItemPosition; 
     return listView.getChildAt(childIndex); 
    } 
} 
+2

To rzeczywiście zwraca widok. Jednak myślę, że zwraca nowy widok zamiast tego, który chcę. – Zero

+0

@ 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

+1

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

2

Można użyć tego kodu

private static void initRecyclerBin(AbsListView view) { 
     try { 
      Field localField = AbsListView.class.getDeclaredField("mRecycler"); 
      localField.setAccessible(true); 
      Object recyclerBin = localField.get(view); 
      Class<?> clazz = Class.forName("android.widget.AbsListView$RecycleBin"); 
      Field scrapField = clazz.getDeclaredField("mScrapViews"); 
      scrapField.setAccessible(true); 
      ArrayList<View>[] scrapViews; 
      scrapViews = (ArrayList<View>[]) scrapField.get(recyclerBin); 
      if (null != scrapViews) { 
       int length = scrapViews.length; 
       for (int i = 0, count = 0; i < length; i++) { 
        if (null != scrapViews[i] && !scrapViews[i].isEmpty()) { 
         for (int j = 0; j < scrapViews[i].size(); j++) { 
          scrapViews[i].get(j);//this is the scrapViews 
         } 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

i ListView getChildViews().

Powiązane problemy