105 votes

Comment fonctionne la méthode getView () lors de la création de votre propre adaptateur personnalisé?

J'ai essayé de lire de nombreux articles mais je ne comprends toujours pas. Mes questions spécifiques sont:

  1. Quelle est exactement la fonction de LayoutInflater?
  2. Pourquoi tous les articles que j'ai lus vérifient-ils si convertview est null ou pas premier? Que signifie-t-il lorsqu'il est nul et que signifie-t-il lorsqu'il ne l'est pas?
  3. Quel est le parent paramétré que cette méthode accepte?

Merci d'avoir regardé!

119voto

Jave Points 14930

1: L' LayoutInflater a votre disposition de fichiers XML et crée de Vue différents-des objets à partir de son contenu.

2: Les adaptateurs sont conçus pour réutiliser les points de Vue, lorsqu'une Vue est défile donc qui n'est plus visible, il peut être utilisé pour l'un des nouveaux points de Vue publiés. Cette réutilisés point de Vue est l' convertView. Si c'est null, cela signifie qu'il n'est pas recyclé Vue et nous avons à en créer un nouveau, sinon nous devrions l'utiliser pour éviter de créer un nouveau.

3: L' parent est fourni de sorte que vous pouvez gonfler votre vue que pour une bonne mise en page des paramètres.

Tous ces ensemble, ils peuvent être utilisés de façon à créer la vue qui s'affichent dans votre liste (ou un autre point de vue, qui prend un adaptateur):

public View getView (int position, View convertView, ViewGroup parent){
    if( convertView == null ){
        //We must create a View:
        convertView = inflater.inflate(R.layout.my_list_item, parent, false);
    }
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView.
    return convertView;
}

Remarquez l'utilisation de l' LayoutInflater, parent peut être utilisé comme un argument pour elle, et combien de convertView sont réutilisés.

72voto

Anh Tuan Points 824

getView() méthode d'Adaptateur pour la génération de point de vue d'un ListView, Gallery,...

  1. LayoutInflater est utilisé pour obtenir la Vue d'un objet qui vous permet de définir une mise en page xml (la racine de l'objet, normalement, une LinearLayout, FrameLayoutou RelativeLayout)

  2. convertView est pour le recyclage. Disons que vous avez une liste qui ne peut afficher que 10 élément à la fois, et il est actuellement l'affichage de l'élément 1 -> item 10. Lorsque vous faites défiler vers le bas d'un élément, l' l'article 1 sera hors de l'écran, et l'article 11 sera affiché. Pour générer la Vue de l'article 11, le getView() la méthode d'appel, et convertView ici est le point de vue de l'élément 1 (qui n'est pas nécessaire plus). Ainsi, au lieu de créer un nouveau point de Vue de l'objet de l'article 11 (qui est coûteux), pourquoi ne pas ré-utiliser convertView? => nous suffit de cocher convertViewest null ou pas, si la valeur est null créer une nouvelle vue, d'autre réutilisation convertView.

  3. parentView , c'est la vue qui contient le point de vue qui getView() générer. Donc, normalement, il est de la liste ou de la Galerie...

Remarque: vous ne faites pas appel de cette méthode, il faut juste mettre en œuvre afin de dire à la vue parent comment générer le point de vue.

8voto

erbsman Points 840

Vous pourriez avoir un coup d'oeil à cette vidéo à propos de l'affichage de la liste. Sa dernière années, Google IO et toujours le meilleur de plain-pied à travers les vues de liste dans mon esprit.

http://www.youtube.com/watch?v=wDBM6wVEO70

  1. Il gonfle les mises en page (les fichiers xml sur votre res/layout/ dossier) en java des Objets tels que des LinearLayout et d'autres points de vue.

  2. Regardez la vidéo, vous obtiendrez à jour avec ce qui l'utilisation de la convertir vue, fondamentalement, de son recyclée à vue en attendant d'être réutilisés par vous, pour éviter de créer un nouvel objet et de ralentir la vitesse de défilement de votre liste.

  3. Vous permet de référencer des vous liste-affichage de la carte.

5voto

Shubhayu Points 5072

Quelle est exactement la fonction de la LayoutInflater?

Lors de la conception de l'utilisation de XML, tous vos éléments d'INTERFACE utilisateur sont seulement les tags et les paramètres. Avant de pouvoir utiliser ces éléments d'INTERFACE utilisateur (par exemple, un TextView ou LinearLayout), vous avez besoin pour créer des objets réels correspondant à ces éléments xml. Qu'est ce que le inflater. Le inflater, utilise ces balises et leurs paramètres correspondants pour créer des objets réels et de régler tous les paramètres. Après cela, vous pouvez obtenir une référence à l'élément d'INTERFACE utilisateur à l'aide de findViewById().

Pourquoi tous les articles que j'ai lu vérifier si convertview a la valeur null ou n'est pas la première? Que signifie le fait qu'elle est nulle et que signifie-t-il quand il ne l'est pas?

C'est une question intéressante. Vous voyez, getView() est appelée chaque fois qu'un élément de la liste est établie. Maintenant, avant de l'élément peut être établi, il doit être créé. Maintenant convertView, fondamentalement, est la dernière utilisée, en vue de dessiner un élément. Dans getView() vous gonflez le xml puis findByViewID() pour obtenir les différents éléments de l'INTERFACE utilisateur de la listitem. Lorsque nous avons vérifier (convertView == null) ce que nous avons à faire est de vérifier que si une vue est null(pour le premier point), puis de créer, d'autre, si elle existe déjà, réutiliser, pas besoin d'aller à travers le gonfler à nouveau. Il est beaucoup plus efficace.

Vous devez également avoir à venir à travers un concept de ViewHolder dans getView(). Cela rend la liste des plus efficace. Ce que nous faisons est de créer un viewholder et stocker la référence à tous les éléments de l'INTERFACE utilisateur que nous avons obtenu après gonflage. De cette façon, nous pouvons éviter d'appeler les nombreux findByViewId() et d'économiser beaucoup de temps. Cette ViewHolder est créé dans le (convertView == null) condition et est stocké dans le convertView à l'aide de setTag(). Dans la boucle, nous venons d'obtenir de retour à l'aide de getView() et de le réutiliser.

Qu'est-ce que le paramètre parent que cette méthode accepte?

Le parent est un ViewGroup à laquelle votre vue créée par getView() est enfin fixé. Maintenant, dans votre cas, ce serait la ListView.

Espérons que cela aide :)

4voto

ngesh Points 8686
  1. L'inflateur de mise en page gonfle / ajoute du XML externe à votre vue actuelle.

  2. getView () est appelé plusieurs fois, y compris lorsqu'il fait défiler. Donc, si la vue est déjà gonflée, nous ne voulons pas la refaire, car gonfler est un processus coûteux. C’est pourquoi nous vérifions si elle est nulle et ensuite, nous le gonflons.

  3. La vue parent est une cellule unique de votre liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X