web-dev-qa-db-fra.com

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

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.

107
lacker

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.

216
Joe

Ce code est plus facile à utiliser:

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

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

6
Feet
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

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