web-dev-qa-db-fra.com

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

Mes questions 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 paramètre parent que cette méthode accepte?
98
GrowinMan

1: LayoutInflater récupère les fichiers XML de votre mise en page et crée différents objets View à partir de son contenu.

2: Les adaptateurs sont conçus pour réutiliser les vues. Lorsqu'une vue est défilée et qu'elle n'est plus visible, elle peut être utilisée pour afficher l'une des nouvelles vues. Cette vue réutilisée est la convertView. Si la valeur est null, cela signifie qu'il n'y a pas de vue recyclée et que nous devons en créer une nouvelle, sinon nous devrions l'utiliser pour éviter d'en créer une nouvelle.

3: Le parent est fourni afin que vous puissiez gonfler votre vue pour obtenir les paramètres de présentation appropriés.

Tous ces éléments peuvent être utilisés ensemble pour créer efficacement la vue qui apparaîtra dans votre liste (ou une autre vue prenant 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;
}

Notez l'utilisation de LayoutInflater, que parent peut être utilisé comme argument, et comment convertView est réutilisé.

115
Jave

getView() la méthode utilisée dans Adapter sert à générer la vue d'un élément d'un ListView, Gallery, ...

  1. LayoutInflater est utilisé pour obtenir l'objet View que vous définissez dans un layout xml (l'objet racine, normalement un LinearLayout, FrameLayout ou RelativeLayout)

  2. convertView est destiné au recyclage. Supposons que vous ayez une vue en liste qui ne peut afficher que 10 éléments à la fois. Elle affiche actuellement les éléments 1 -> élément 10. Lorsque vous faites défiler un élément, l'élément 1 disparaît de l'écran et l'élément 11 est affiché. . Pour générer View pour l'élément 11, la méthode getView () sera appelée, et convertView voici la vue de l'élément 1 (qui n'est plus nécessaire). Donc, créez plutôt un nouvel objet View pour l'élément 11 (ce qui est coûteux), pourquoi ne pas réutiliser convertView? => nous vérifions simplement que convertView est null ou non, si null crée une nouvelle vue, sinon, réutilise convertView.

  3. parentView est le ListView ou la Galerie ... qui contient la vue de l'élément qui getView() génère.

Remarque : vous n'appelez pas cette méthode directement, vous devez simplement l'implémenter pour indiquer à la vue parent comment générer la vue de l'élément.

67
Anh Tuan

Vous pouvez regarder cette vidéo sur la vue liste. C’est depuis Google IO) et c’est toujours le meilleur moyen de parcourir les vues de liste dans mon esprit.

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

  1. Il gonfle les mises en page (les fichiers XML sur votre dossier res/layout /) en Java tels que LinearLayout et d’autres vues.

  2. Regardez la vidéo, vous serez au courant de l'utilisation de la vue Convert, c'est en fait une vue recyclée en attente de réutilisation par vous, pour éviter de créer un nouvel objet et de ralentir le défilement de votre liste.

  3. Vous permet de référencer votre vue en liste depuis l'adaptateur.

8
erbsman

Quelle est exactement la fonction de LayoutInflater?

Lorsque vous concevez à l'aide de XML, tous vos éléments d'interface utilisateur ne sont que des balises et des paramètres. Avant de pouvoir utiliser ces éléments d'interface utilisateur (par exemple, un TextView ou LinearLayout), vous devez créer les objets réels correspondant à ces éléments xml. C'est à cela que sert l'inflateur. Le gonfleur utilise ces balises et leurs paramètres correspondants pour créer les objets réels et définir 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 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?

Celui-ci est intéressant. Vous voyez, getView () est appelée à chaque fois qu'un élément de la liste est dessiné. Maintenant, avant que l'élément puisse être dessiné, il doit être créé. Maintenant, convertView est essentiellement la dernière vue utilisée pour dessiner un élément. Dans getView (), vous devez d'abord gonfler le fichier XML, puis utiliser findByViewID () pour obtenir les différents éléments d'interface utilisateur de l'élément de liste. Lorsque nous vérifions (convertView == null), nous vérifions que si une vue est nulle (pour le premier élément), créez-la, sinon, si elle existe déjà, réutilisez-la, inutile de repasser par le processus de décompression. . Le rend beaucoup plus efficace.

Vous devez également avoir rencontré un concept de ViewHolder dans getView (). Cela rend la liste plus efficace. Ce que nous faisons est de créer un utilisateur et de stocker la référence à tous les éléments d'interface utilisateur que nous avons obtenus après le gonflage. De cette façon, nous pouvons éviter d'appeler les nombreux findByViewId () et gagner beaucoup de temps. Ce ViewHolder est créé dans la condition (convertView == null) et est stocké dans convertView à l'aide de setTag (). Dans la boucle else, nous le récupérons simplement à l'aide de getView () et le réutilisons.

Quel est le paramètre parent que cette méthode accepte?

Le parent est un ViewGroup auquel votre vue créée par getView () est finalement attachée. Maintenant, dans votre cas, ce serait le ListView.

J'espère que cela t'aides :)

5
Shubhayu
  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 puis nous la gonflons.

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

4
ngesh

LayoutInflater est utilisé pour générer des vues dynamiques du XML pour l'élément ListView ou dans onCreateView du fragment.

ConvertView est essentiellement utilisé pour recycler les vues qui ne sont pas dans la vue actuellement. Supposons que vous avez un ListView à défilement. Lors du défilement vers le bas ou vers le haut, le convertView donne la vue qui a été défilée. Cette réutilisation économise de la mémoire.

Le paramètre parent de la méthode getView() donne une référence à la mise en page parent qui a la liste. Supposons que vous souhaitiez obtenir l'ID de tout élément du code XML parent que vous pouvez utiliser:

ViewParent nv = parent.getParent();

while (nv != null) {

    if (View.class.isInstance(nv)) {
        final View button = ((View) nv).findViewById(R.id.remove);
        if (button != null) {
            // FOUND IT!
            // do something, then break;
            button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("Remove", "Remove clicked");

                    ((Button) button).setText("Hi");
                }
            });
        }
        break;
    }

 }
2
user936414

La méthode getView() crée un nouveau View ou ViewGroup pour chaque ligne de Listview ou de Spinner. Vous pouvez définir ceci View ou ViewGroup dans un fichier Layout XML Dans le dossier res/layout Et lui donner la référence en objet Adapter class.

si vous avez 4 éléments dans un tableau transmis à l'adaptateur. La méthode getView() créera 4 vues pour 4 lignes d'Adaper.

La classe LayoutInflater a une méthode inflate () qui crée un objet View View à partir d'une structure de ressources XML.

1
Ravi1187342

Vous pouvez également trouver des informations utiles sur getView sur l'interface de l'adaptateur dans le fichier Adapter.Java. Ça dit;

    /**
 * Get a View that displays the data at the specified position in the data set. You can either
 * create a View manually or inflate it from an XML layout file. When the View is inflated, the
 * parent View (GridView, ListView...) will apply default layout parameters unless you use
 * {@link Android.view.LayoutInflater#inflate(int, Android.view.ViewGroup, boolean)}
 * to specify a root view and to prevent attachment to the root.
 * 
 * @param position The position of the item within the adapter's data set of the item whose view
 *        we want.
 * @param convertView The old view to reuse, if possible. Note: You should check that this view
 *        is non-null and of an appropriate type before using. If it is not possible to convert
 *        this view to display the correct data, this method can create a new view.
 *        Heterogeneous lists can specify their number of view types, so that this View is
 *        always of the right type (see {@link #getViewTypeCount()} and
 *        {@link #getItemViewType(int)}).
 * @param parent The parent that this view will eventually be attached to
 * @return A View corresponding to the data at the specified position.
 */
View getView(int position, View convertView, ViewGroup parent);
0
Hamza Polat