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.
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.
ce code est plus facile à utiliser:
View rowView = listView.getChildAt(viewIndex);//The item number in the List View
if(rowView != null)
{
// Your code here
}
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
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
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.