2011-03-28 7 views
2

L'appel de setSelection() de ListView semble avoir un problème. beaucoup de gens posent des questions à ce sujet. il y a des réponses mais aucune ne fonctionne. ignorer les problèmes d'effets visuels. Voici un scénario de base qui se traduit par des résultats inattendus:listView.setSelection (n); m = listView.getSelectedItemPosition(); // m! = n. Pourquoi?

listView.setSelection(5); //listView is a ListView. there are >= 6 items in the list 
int sel=listView.getSelectedItemPosition(); 

vous attendez == 5 sel mais en réalité il est -1 (la méthode ne fonctionnait pas?)
est donc ce un bug et sinon, ce sont les règles qui régissent l'établissement et la récupération de l'élément sélectionné?

Répondre

2

Si vous voyez dans la documentation de setSelection vous trouvez ceci:

Définit l'élément sélectionné. Si en mode tactile, l'élément ne sera pas sélectionné, mais il sera toujours positionné de manière appropriée. Si la position de sélection spécifiée est inférieure à , alors l'article à la position 0 sera sélectionné.

Ainsi, il est parfaitement logique que cela renvoie -1. L'élément n'est pas sélectionné même si vous exécutez cette méthode lorsque vous êtes en mode tactile, comme vous le faites très probablement.

+0

qu'est-ce que cela signifie ** mais il sera toujours positionné de manière appropriée **? – inor

+0

Je ne l'ai pas essayé, mais je suppose que cela signifie que l'objet sera au centre de l'écran, ou du moins il sera visible. –

+0

merci. Je me demande s'il ne serait pas plus logique pour la méthode setSelection de lancer RuntimeException si elle ne fait rien à cause du mode dans lequel elle est actuellement (mode tactile). cela pourrait vous faire économiser beaucoup de temps et de questions car l'appel se comporte comme si tout était normal et il a exécuté ce que vous lui avez demandé ... – inor

0

Je suis d'accord avec la réponse d'Eric. Cependant, si vous voulez toujours le faire fonctionner, voici un travail.

pour votre partie onItemClick utilisez ce qui suit (j'ai eu plusieurs listviews ...)

public void onItemClick(AdapterView<?> parentView, View v, int chosenPosition, long  
myLong) { 
    switch(parentView.getId()){ 
    case R.id.Hrlist: 
     parentView.setSelection(chosenPosition); 
     break; 
    case R.id.Minlist: 
     parentView.setSelection(chosenPosition); 
     break; 
    case R.id.Seclist: 
     parentView.setSelection(chosenPosition); 
    } 
} 

Ensuite, dans l'autre méthode, vous pouvez utiliser quelque chose le long des lignes de:

HrList.getFirstVisiblePosition(); 

HrList En supposant est défini comme

ListView HrList = (ListView) findViewById(R.id.Hrlist); 

Alors oui, en mode tactile, il n'enregistre pas l'élément comme sele cted. Cependant, il le déplace vers un emplacement fiable (c'est-à-dire en haut) que vous pouvez utiliser pour obtenir la valeur.