2010-06-24 5 views
10

Existe-t-il un moyen d'obtenir la première vue visible sur ListView dans Android?Comment afficher la première Visualisation visible depuis une liste AndroidView

Je peux obtenir les données qui soutiennent la première vue dans l'adaptateur, mais il semble que je ne peux pas obtenir la première vue dans ListView.

Je veux changer la première vue visible après une action de défilement terminée. Je sais que je ne devrais pas enregistrer des références à la vue.

+0

Les vues sont recyclées. De quoi avez-vous besoin pour la vue spécifique? –

+0

Je modifie ma question. Je veux changer la vue après que l'utilisateur ait fait défiler la liste. – Janusz

Répondre

12

En fait, les éléments ListView ne sont que des enfants de ListView. Donc, premier élément ListView visible est:

listView.getChildAt(0) 
+0

merci fonctionne très bien si vous sondez la vue retournée pour null. Il semble que le défilement et la création de liste se produisent parfois en même temps si vous démarrez l'activité et parfois la liste n'a pas d'enfant. – Janusz

+5

Je pense que c'est une erreur. Parce que vous obtenez le premier élément chargé. et peut-être que cet objet n'est pas visible en premier. Mais listView.getFirstVisiblePosition() est meilleur et fonctionne toujours bien. – NrNazifi

+0

Pas précis s'il y a des en-têtes. –

3

ListView a une fonction getFirstVisiblePosition afin d'obtenir la première vue visible, le code serait:

listView.getChildAt(listView.getFirstVisiblePosition());

+7

Il existe une différence entre la position childAt() et la position renvoyée par getFirstVisiblePosition(). La position de getFirstVisiblePosition est la position dans mon adaptateur de données. ChildAt ne prend en compte que les vues visibles dans la liste pour le moment. – Janusz

+0

J'ai aimé la réponse et j'ai trouvé utile de trouver quelque chose qui fonctionne. Pourtant, utiliser childAt avec la position dans l'adaptateur ne fonctionnera pas. Si vous utilisez fetFirstVisiblePosition, vous devez le transmettre à nouveau à l'adaptateur en utilisant getItem. Donc plus correct serait adapter.getItem (listview.getFirstVisiblePosition). Pourtant, dans ce cas, vous n'avez pas la vue que l'op demandé. Néanmoins, merci de le signaler. –

3

En effet listView.getChildAt(listView.getFirstVisiblePosition()) donne le premier élément visible,
MAIS il pourrait être moitié visible liste article.

Pour premier élément de liste complètement visible,

if (listView.getChildAt(0).getTop() < 0) { 
    int firstCompletelyVisiblePos = listView.getFirstVisiblePosition() + 1; 
} 
0

Vous pouvez utiliser le code suivant:

for (int i = 0; i <= conversationListView.getLastVisiblePosition() - conversationListView.getFirstVisiblePosition(); i++) { 
     View listItem = conversationListView.getChildAt(i); 
} 
0

listView.scrollBy (0, -40); Ceci fonctionne très bien

Questions connexes