web-dev-qa-db-fra.com

Android AdapterView?

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?

34
Student Student

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) .

24
Leonidos

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:

Tutoriels pour développeurs Sony - 3D ListView

6
Nezam

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.

5
Ridcully

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.

2
TechnalyticSteve