109 votes

Android: accéder aux vues enfant à partir d'un ListView

J'ai besoin de savoir la position d'un pixel d'un élément dans une liste qui est affichée à l'aide d'un ListView. Il me semble que je devrais obtenir un de la TextViews et ensuite utiliser getTop(), mais je ne peux pas comprendre comment obtenir un enfant en vue d'une ListView.

Mise à jour: les enfants de L' ViewGroup ne correspondent pas 1 pour 1 avec des éléments de la liste, pour un ListView. Au lieu de cela, l' ViewGroups'enfants correspondre à ce que ces points de vue qui sont visibles à droite maintenant. Donc, getChildAt() fonctionne sur un indice qui est interne à l' ViewGroup et n'a pas nécessairement quelque chose à voir avec la position dans la liste que l' ListView utilise. :-)

216voto

Joe Points 20463

Voir: Android ListView: obtenir l'index de données de l'élément visible et le combiner avec une partie de la réponse de Feet 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 ne parcourez pas les enfants de ListView, ce qui pourrait entraîner des problèmes de performances.

18voto

khr2003 Points 915

Ce code est plus facile à utiliser:

  View rowView = listView.getChildAt(viewID);
                if(rowView != null)
                {
                    // do whatever you want here
                }
 

6voto

Feet Points 1544

Une recherche rapide dans la documentation de la classe ListView a révélé les méthodes getChildCount () et getChildAt () héritées de ViewGroup. Pouvez-vous les parcourir en les utilisant? Je ne suis pas sûr mais ça vaut le coup d'essayer.

Trouvé ici

5voto

Wes Points 39
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));

                }
            }

        }

    });

Fondamentalement, la création de deux un drawable - un qui est transparent, et une autre qui est la couleur désirée. Attention à l'endroit où vous avez cliqué (int position définie) et de changer la couleur de la dite ligne. Puis promenade à travers le parent listview, et de modifier toutes les autres lignes en conséquence. Ce qui représente quand un utilisateur clique sur la liste plusieurs fois. Cela se fait avec une mise en page personnalisée pour chaque ligne dans la liste. (Très simple, il suffit d'un nouveau fichier de mise en page avec un textview - ne pas définir focusable ou cliquable!!!) Aucun adaptateur requis - utilisation de la matrice de l'adaptateur

-9voto

jasonhudgins Points 1732

Cela suppose que vous connaissez la position de l’élément dans ListView :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X