Android: accédez aux vues des enfants à partir D'un ListView

je dois trouver la position en pixels d'un élément dans une liste qui a été affichée en utilisant un ListView . Il semble que je devrais obtenir l'un des TextView et puis utiliser getTop() , mais je ne peux pas comprendre comment obtenir une vue d'enfant d'un ListView .

mise à Jour: les enfants de La ViewGroup ne correspondent pas 1 pour 1 avec des éléments de la liste, pour un ListView . Au lieu de cela, le ViewGroup 's les enfants ne correspondent qu'aux points de vue qui sont visibles en ce moment. Donc getChildAt() fonctionne sur un index interne au ViewGroup et n'a pas nécessairement quelque chose à voir avec la position dans la liste que le ListView utilise.

104
demandé sur N J 2008-11-03 01:40:49

6 réponses

Voir: Android ListView: obtenir les données index de l'élément visible et combiner avec une partie de la réponse de pieds ci-dessus, peut vous donner quelque chose comme:

int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
  Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
  return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);

l'avantage est que vous n'êtes pas itérer sur les enfants de ListView, qui pourrait prendre un coup de performance.

214
répondu Joe 2017-05-23 12:17:53

ce code est plus facile à utiliser:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }
17
répondu Kalimah Apps 2017-01-31 00:26:35

une recherche rapide des docs pour la classe ListView a fait apparaître les méthodes getChildCount() et getChildAt() héritées de ViewGroup. Pouvez-vous itérer à travers eux en utilisant ceux-ci? Je ne suis pas sûr, mais ça vaut le coup d'essayer.

Trouvé ici

6
répondu Feet 2008-11-02 23:04:55
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

  @Override
public void onItemClick(AdapterView<?> parent, final View view, int position, long   id) 
{       
    View v; 
    int count = parent.getChildCount();
    v =parent.getChildAt(position);
    parent.requestChildFocus(v, view);  v.setBackground(res.getDrawable(R.drawable.transparent_button));
            for (int i=0; i<count; i++)
            {
                if (i!= position)
                {
                    v = parent.getChildAt(i);t  v.setBackground(res.getDrawable(R.drawable.not_clicked));

                }
            }
        }
    });

essentiellement, créer deux tirables - un qui est transparent, et un autre qui est la couleur désirée. Demander la mise au point à la position cliquée (position int telle que définie) et changer la couleur de ladite rangée. Ensuite, passez par le parent listview , et changez toutes les autres lignes en conséquence. Cela tient compte du fait qu'un utilisateur clique plusieurs fois sur le listview . Ceci est fait avec une mise en page personnalisée pour chaque ligne dans le listview . (Très simple, il suffit d'un nouveau fichier de mise en page avec un textview - Ne définissez ni focus ni cliquable!) Aucun adaptateur personnalisé requis - utiliser un adaptateur réseau

5
répondu Wes 2015-12-07 06:55:36
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
4
répondu Milaaaad 2016-01-29 08:11:43

cela suppose que vous connaissez la position de l'élément dans ListView:

  View element = listView.getListAdapter().getView(position, null, null);

alors vous devriez être en mesure d'appeler getLeft() et getTop() pour déterminer les éléments sur la position de l'écran.

-9
répondu jasonhudgins 2008-12-04 14:08:27