Documents dites:
Lorsque le contenu de votre présentation est dynamique ou non prédéterminé, vous pouvez utiliser une présentation qui sous-classe AdapterView pour remplir la présentation avec des vues lors de l'exécution. Une sous-classe de la classe AdapterView utilise un adaptateur pour lier des données à sa disposition.
Mais la plupart des didacticiels se trouvent dans environ ListView
, GridView
, Spinner
et Gallery
.
Je cherche à étendre une sous-classe directement à partir de AdapterView
. Je dois créer une vue personnalisée indiquant que son contenu dépend d'un adaptateur.
Comment puis-je faire cela et quelles méthodes doivent être remplacées?
Tout d'abord, vous devez être absolument sûr que AdapterView
est ce que vous voulez, car toutes les vues "dynamiques ou non prédéterminées" ne peuvent pas être implémentées via AdapterView
. Parfois, vous feriez mieux de créer votre vue en étendant ViewGroup
.
si vous voulez utiliser AdapterView
, jetez un oeil à cet exemple vraiment sympa . Il existe de nombreuses vues personnalisées avec adaptateur sur GitHub. Découvrez celui-ci (étend ViewGroup
) .
Ce n'est peut-être pas une réponse totale à votre question mais je vous montre très probablement un point de départ ou un pointeur qui peut vous guider:
ListView
étend AbsListView
qui à son tour étend AdapterView<ListAdapter>
. Donc, si vous devez absolument implémenter une telle vue personnalisée à partir de zéro, vous pouvez consulter le code source de ces classes:
Mais attention, c'est toute une tâche. Il peut être suffisant d'utiliser l'une des classes existantes et de modifier l'apparence.
Dériver de AdapterView
peut fonctionner, mais il peut ne pas être aussi bénéfique que vous l'espérez. Une partie de l'infrastructure fournie par AdapterView
est privée au niveau du package, ce qui signifie que nous n'y avons pas accès.
Par exemple, AdapterView
gère l'index d'élément sélectionné pour AbsListView
et ListView
. Cependant, étant donné que les méthodes comme setNextSelectedPositionInt(int position)
(qui est le seul chemin pour définir mNextSelectedPosition
) sont privées au package, nous ne pouvons pas y accéder. AbsListView
et ListView
peuvent y accéder car ils sont dans le même paquet, mais nous ne pouvons pas.
(Si vous creusez dans la source AdapterView
, vous constaterez que setNextSelectedPositionInt()
est appelé depuis handleDataChanged()
. Malheureusement handleDataChanged()
est également privé du package et est _not_called
de n'importe où ailleurs dans AdapterView
qui pourrait être utilisé pour activer la position de réglage.)
Cela signifie que si vous devez gérer la position sélectionnée, vous devrez recréer cette infrastructure dans votre classe dérivée (ou vous devrez dériver de ListView
ou AbsListView
... bien que je suspectez que vous rencontrerez des problèmes similaires dérivant de AbsListView
). Cela signifie également que toute fonctionnalité AdapterView
qui tourne autour de la sélection d'éléments ne sera probablement pas pleinement opérationnelle.