Android: Accéder aux vues enfant à partir d'un ListView
-
05-07-2019 - |
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.
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.