2013-08-27 18 views
17

Per un'app su cui sto lavorando, sto cercando di ottenere i figli di un controllo ListView. Per fare questo ho il seguente pezzo di codice:Get ListView bambini non visibili

View listItem = mListView.getChildAt(i); 

Tuttavia, questo funziona solo per i bambini che sono in vista. Devo anche raggiungere i bambini che non sono in vista. Come lo farei?

EDIT:

Confrontando i metodi suggeriti a quello che stavo già usando trovo la seguente:

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] 

punti listItem2 al reale View in ListView, che è quello che voglio tranne che funziona solo per i Views che sono in vista. È possibile visualizzare dal file di registro che listItem1 e listItem2 non corrispondono.

EDIT 2:

mi si avvicinò con il seguente:

for (int i = 0; i < mListView.getCount(); i++) { 
    RelativeLayout listItem = (RelativeLayout) mListView.getAdapter().getView(i, mListView.getChildAt(i), mListView); 
} 

Questo restituisce correttamente le Visualizzazioni per tutti gli elementi visibili nella lista. Tuttavia, restituisce una vista diversa per quelli che non sono in vista.

EDIT 3:

Grazie a nfirex ho una risposta di lavoro. Ciò restituirà Visualizzazioni anche se non sono direttamente in vista:

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

risposta

33

È necessario metodo Adapter.getView():

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

UPDATE:

È necessario creare il metodo. Qualcosa di simile a questo:

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

Ciò restituisce effettivamente una visualizzazione. Tuttavia, penso che restituisca una nuova vista al posto di quella che voglio. – Zero

+0

@Zero Quale vista è necessario recuperare? Method ListView.getChildAt (i) restituirà child (è il metodo di ViewGroup), che è stato anticipato dalla scheda. Adapter.getView (pos, oldView, parent) restituirà nuova vista (se oldView == null) o oldView con dati che contiene in Adapter.getItem (pos) per posizione dell'elemento nell'elenco di dati. Si desidera ricevere viste che rimangono anche in ListView per indice? – nfirex

+1

Sto cercando di ottenere la vista che ottengo anche con getChildAt (i), ma per le viste che non sono visibili (se ho 8 elementi sullo schermo e richiedo getChildAt (10), che sarà lì se faccio scorrere verso il basso, ricevo una NullPointerException) – Zero

2

È possibile utilizzare questo codice

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

e ListView getChildViews().