J'ai besoin de connaître la position en pixels d'un élément de la liste qui a été affichée à l'aide de ListView
. Il semble que je devrais obtenir l'un des TextView's et ensuite utiliser getTop()
, mais je ne peux pas comprendre comment obtenir une vue enfant d'un ListView
.
Mise à jour: Les enfants de ViewGroup
ne correspondent pas 1 à 1 avec les éléments de la liste, pour un ListView
. Au lieu de cela, les enfants de ViewGroup
ne correspondent qu'aux vues visibles actuellement. Donc, getChildAt()
agit sur un index interne à ViewGroup
et n'a pas nécessairement de lien avec la position dans la liste utilisée par ListView
.
Voir: Android ListView: obtenir l'index de données de l'é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 est que vous ne parcourez pas les enfants de ListView, ce qui pourrait entraîner des problèmes de performances.
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.
Je l'ai 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));
}
}
}
});
Fondamentalement, créez deux Drawables - un transparent et un autre de la couleur souhaitée. Demander le focus à la position cliquée (int position
comme défini) et change la couleur de ladite ligne. Parcourez ensuite le parent ListView
et modifiez toutes les autres lignes en conséquence. Cela explique quand 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 paramètre focusable ou cliquable!).
Aucun adaptateur personnalisé requis - utilisez ArrayAdapter
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);