Obtiens des enfants ListView qui ne sont pas en vue

Pour une application sur laquelle je travaille, j'essaie d'obtenir les enfants d'un ListView. Pour ce faire, j'ai le code suivant:

View listItem = mListView.getChildAt(i); 

Cependant, cela ne fonctionne que pour les enfants qui sont en vue. Je dois également atteindre les enfants qui ne sont pas en vue. Comment ferais-je cela?

  • Appel à OpenGL ES API sans contexte actuel (enregistré une fois par thread)
  • Chaîne extensible avec image ne fonctionnant pas avec notification push
  • Déplacer les mises en page lorsque le clavier est affiché?
  • Google maps api pour Android, obtenant SHA1 cert au lieu de MD5
  • SetContentView () lent avec fragment de carte
  • Android auto-logout lorsque l'application va à l'arrière-plan
  • MODIFIER:

    En comparant les méthodes suggérées à celle que j'avais déjà utilisée, je trouve ce qui suit:

     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: android.widget.RelativeLayout@2c5f2920 08-27 14:16:56.628: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c06d938 08-27 14:16:56.628: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c72dfb0 08-27 14:16:56.628: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bfabe50 08-27 14:16:56.638: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c730c18 08-27 14:16:56.638: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c0d3e38 08-27 14:16:56.638: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c12ebc0 08-27 14:16:56.638: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bddbf70 08-27 14:16:56.648: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c131828 08-27 14:16:56.648: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bdf3270 08-27 14:16:56.648: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c140de0 08-27 14:16:56.648: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c0c8d30 

    ListItem2 indique la vue actuelle dans ListView, ce que je veux, sauf que cela ne fonctionne que pour les vues qui sont en vue. Vous pouvez voir à partir du fichier journal que listItem1 et listItem2 ne correspondent pas.

    EDIT 2:

    J'ai trouvé ce qui suit:

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

    Cela renvoie les vues correctement pour tous les éléments visibles dans la liste. Cependant, il renvoie une vue différente pour ceux qui ne sont pas en vue.

    EDIT 3:

    Merci à nfirex. J'ai une réponse utile. Cela renverra les Vues même si elles ne sont pas directement en vue:

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

  • Auditeur d'événements personnalisé sur l'application Android
  • 2 Solutions collect form web for “Obtiens des enfants ListView qui ne sont pas en vue”

    Vous avez besoin de la méthode Adapter.getView () :

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

    METTRE À JOUR:

    Vous devez créer votre méthode. Quelque chose comme ça:

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

    Vous pouvez utiliser ce code

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

    Et ListView getChildViews ().

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.