Comment puis-je créer un ListView qui est pas dans un ScrollView, ou a le ScrollView désactivé?
-
19-09-2019 - |
Question
Je veux quelques-uns des goodies dans un ListView, comme être en mesure d'utiliser un ListAdapter et la sélection des objets, etc, mais je ne veux pas la partie ScrollView de celui-ci. Je veux mettre en œuvre moi-même partie, d'une manière différente (pourquoi ou comment je fais ce n'est pas vraiment le point de cette question, alors s'il vous plaît ne demande pas « pourquoi »).
Est-il possible d'avoir un ListView qui n'est pas dans un ScrollView ou a le défilement désactivé?
La solution
Un ListView
n'est pas dans un ScrollView
. Un ListView
ne défilement intrinsèquement. Je ne crois pas que vous pouvez désactiver le défilement via une API simple. Si oui, vos choix sont soit sous-classe ListView
et essayer de trouver des façons de passer outre les comportements de défilement, ListView
clone et éliminer les comportements de défilement, ou écrire votre propre AdapterView
qui rend les choses comme vous voulez.
Autres conseils
Une autre façon de le faire est d'envelopper le ListView
quelle que soit la solution défilement personnalisée que vous avez concoctée. Si vous définissez simplement la hauteur du ListView
être exactement aussi haut que toutes les lignes (en utilisant la LayoutParams
de vue sur la liste), il agira comme une vue normale et ne sera pas en mesure de faire défiler; vous pouvez donc l'ajouter à une autre vue de défilement. La difficulté de cette méthode est que vous devez savoir à l'avance la hauteur de votre liste, vous devez connaître la hauteur de chaque ligne. En outre, cela va créer toutes les lignes à la fois et donc vous ne serez pas en mesure de profiter de la fonction de vue de recyclage.
Si vous ne disposez pas d'un moyen simple de calculer la hauteur à l'avance, vous pouvez tromper le ListView
en pour vous faire en remplaçant onMeasure
et en lui donnant votre propre spécification de hauteur:
// Calculate height of the entire list by providing a very large
// height hint. But do not use the highest 2 bits of this integer;
// those are reserved for the MeasureSpec mode.
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);