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 du LayoutInflater?
  2. pourquoi tous les articles que j'ai lus vérifient-ils si convertview est nul ou pas en premier? Que signifie le fait qu'elle est nulle et que signifie-t-il quand il ne l'est pas?
  3. Quel est le paramètre parent que cette méthode accepte?
93
demandé sur jaysoifer 2012-04-12 12:38:20

8 réponses

1: Le LayoutInflater prend votre mise en page XML-files et crée des vues-objets différents de son contenu.

2: les adaptateurs sont construits pour réutiliser les vues, lorsqu'une vue est étalée de sorte qu'elle ne soit plus visible, elle peut être utilisée pour l'une des nouvelles vues apparaissant. Cette vue réutilisée est le 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: le parent est fourni de sorte que vous pouvez gonfler votre vue dans cela pour les paramètres de mise en page appropriés.

tous ces ensembles peuvent être utilisés pour créer efficacement la vue qui apparaîtra dans votre liste (ou toute autre 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 du LayoutInflater , que parent peut être utilisé comme argument, et comment convertView est réutilisé.

109
répondu Jave 2012-04-12 08:52:24

getView() méthode dans Adaptateur est pour générer la vue de l'article d'un ListView , Gallery ,...

  1. LayoutInflater est utilisé pour obtenir l'objet View que vous définissez dans une mise en page xml( l'objet root, normalement un LinearLayout , FrameLayout , ou RelativeLayout )

  2. convertView est destiné au recyclage. Disons que vous avez une listview qui ne peut afficher que 10 articles à la fois, et actuellement c'est l'affichage de l'élément 1 -> item 10. Lorsque vous faites défiler vers le bas un élément, le l'article 1 sera hors de l'écran, et l'article 11 sera affiché. De generate View pour l'article 11, la méthode getView () sera appelée, et convertView voici le point de vue du point 1 (qui n'est pas nécessaire plus). Ainsi, à la place, créez un nouvel objet de vue pour l'article 11 (qui est coûteux), pourquoi ne pas réutiliser convertView ? => nous vérifions juste convertView est null ou non, si null crée une nouvelle vue, sinon réutilisez convertView .

  3. parentView est la vue qui contenait la vue de l'article qui getView() génère. Normalement C'est ListView ou Gallery...

Note : vous n'appelez pas cette méthode directement, juste besoin de l'implémenter pour dire la vue mère comment générer la vue de l'élément.

66
répondu Anh Tuan 2016-06-27 11:23:44

vous pouvez regarder cette vidéo à propos de la vue Liste. Son des dernières années Google IO et toujours le meilleur walk-through sur les vues de liste dans mon esprit.

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

  1. il gonfle les layouts (les fichiers xml sur votre res/layout/ folder) dans des objets java tels que LinearLayout et d'autres vues.

  2. Regardez la vidéo, va vous mettre à jour avec ce que l'utilisation de la vue convertir, essentiellement son une vue recyclé en attente d'être réutilisé par vous, pour éviter de créer un nouvel objet et ralentir le défilement de votre liste.

  3. vous permet de consulter votre liste à partir de l'adaptateur.

9
répondu erbsman 2012-04-12 08:42:55

Quelle est exactement la fonction du LayoutInflater?

lorsque vous concevez en utilisant XML, tous vos éléments D'interface utilisateur ne sont que des étiquettes et des paramètres. Avant de pouvoir utiliser ces éléments D'interface utilisateur (par exemple TextView ou LinearLayout), vous devez créer les objets réels correspondant à ces éléments xml. C'est à ça que sert le gonfleur. Le gonfleur, utilise ces tags et leurs paramètres correspondants pour créer les objets réels et mettre tous les paramètre. Après cela, vous pouvez obtenir une référence à L'élément UI en utilisant findViewById().

pourquoi tous les articles que j'ai lus vérifient-ils si convertview est nul ou pas en premier? Que signifie le fait qu'elle est nulle et que signifie-t-il quand il ne l'est pas?

c'est intéressant. Vous voyez, getView() est appelée chaque fois qu'un élément de la liste est établie. Maintenant, avant que l'article puisse être dessiné, il doit être créé. Maintenant convertView fondamentalement, la dernière vue de dessiner un élément. Dans getView (), vous gonflez d'abord le xml, puis vous utilisez findByViewID () pour obtenir les différents éléments de L'interface utilisateur de listitem. Lorsque nous vérifions (convertView == null), ce que nous faisons est de vérifier que si une vue est nulle(pour le premier élément) alors créez-la, Sinon, si elle existe déjà, réutilisez-la, pas besoin de passer par le processus de gonflage à nouveau. Il est beaucoup plus efficace.

vous devez également avoir rencontré un concept de titulaire de vue dans getView(). Cela rend la liste des plus efficace. Ce que nous faisons est de créer un viseur et de stocker la référence à tous les éléments UI que nous avons obtenu après gonflage. De cette façon, nous pouvons éviter d'appeler les nombreux findByViewId() et gagner beaucoup de temps. Ce titulaire de vue est créé dans la condition (convertView == null) et est stocké dans la convertView en utilisant setTag(). Dans la boucle else, nous l'obtenons simplement en utilisant getView () et nous le réutilisons.

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

le parent est un groupe de vue auquel votre vue créée par getView() est finalement attachée. Dans votre cas, ce serait le ListView.

Espérons que cela aide :)

5
répondu Shubhayu 2012-04-12 09:27:22
  1. Mise en page gonfleur gonfle/ajoute XML externe à votre vue actuelle.

  2. getView() est appelé plusieurs fois, y compris lorsqu'il est défilé. Donc, s'il a déjà la vue gonflée nous ne voulons pas le refaire car gonfler est un processus coûteux.. c'est pourquoi nous vérifions si son nul et puis le gonfler.

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

4
répondu ngesh 2012-04-12 08:44:16

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

ConvertView est fondamentalement utilisé pour recycler les vues qui ne sont pas dans la vue actuellement. Dites que vous avez un scrollable ListView . En faisant défiler vers le bas ou vers le haut, le convertView donne la vue qui a été défilée. Ce réemploi sauve la mémoire.

le paramètre parent de la méthode getView() donne une référence à le layout parent qui a le listView. Dites que vous voulez obtenir L'Id de n'importe quel élément dans le parent XML 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
répondu user936414 2016-11-21 19:14:48

getView() méthode créer une nouvelle View ou ViewGroup pour chaque rangée de Listview ou de fileur . Vous pouvez définir ce View ou ViewGroup dans un fichier Layout XML dans le dossier res/layout et pouvez donner la référence à L'objet de classe Adapter .

si vous avez 4 articles dans un tableau passé à L'Adaptateur. La méthode getView() créera 4 vues pour 4 lignes d'Adaptateur.

LayoutInflater classe a une méthode gonfler() whic Vue de créer un Objet à partir de ressources XML de mise en page.

1
répondu Ravi1187342 2012-04-12 09:06:32

vous pouvez également trouver des informations utiles sur getView à l'Interface Adaptateur dans Adaptateur.fichier java.

    /**
 * 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
répondu Hamza Polat 2016-12-09 08:27:03