Question

Je dois connaître la position en pixels d'un élément d'une liste affichée à l'aide d'un ListView . Il semble que je devrais obtenir l'un des TextView , puis utiliser getTop () , mais je ne vois pas comment obtenir une vue enfant d'un ListView .

Mise à jour : les enfants du ViewGroup ne correspondent pas les uns aux autres avec les éléments de la liste, pour un ListView . Au lieu de cela, les enfants de ViewGroup correspondent uniquement aux vues visibles actuellement. Donc, getChildAt () agit sur un index interne au ViewGroup et n’a nécessairement rien à voir avec la position dans la liste que ListView utilise.

Était-ce utile?

La solution

Voir: Android ListView: obtenez l'index de données de élément visible et 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, c’est que vous ne parcourez pas les enfants de ListView, ce qui risquerait d’avoir un impact négatif sur les performances.

Autres conseils

Ce code est plus facile à utiliser:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }

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

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);
                v.setBackground(res.getDrawable(R.drawable.not_clicked));
            }
        }
    }
});

En gros, créez deux Dessins (Dessins) - l'un transparent, et l'autre de la couleur souhaitée. Demandez le focus à la position cliquée ( int position tel que défini) et modifiez la couleur de ladite ligne. Parcourez ensuite le ListView parent et modifiez toutes les autres lignes en conséquence. Cela est utile lorsqu'un utilisateur clique plusieurs fois sur listview . Cela se fait avec une mise en page personnalisée pour chaque ligne du ListView . (Très simple, il suffit de créer un nouveau fichier de mise en page avec un TextView - ne définissez pas le focus ou le clic sur!!).

Aucun adaptateur personnalisé requis - utilisez ArrayAdapter

int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);

Cela suppose que vous connaissiez la position de l'élément dans ListView:

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

Ensuite, vous devriez pouvoir appeler getLeft () et getTop () pour déterminer les éléments sur la position de l'écran.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top