2012-11-07 3 views
1

Nous travaillons actuellement avec des vues de liste à l'université. Mon professeur nous a donné une application simple qui affiche les messages dans une liste et lorsque l'utilisateur en sélectionne un, il affiche le contenu du message dans une nouvelle activité. Je comprends à peu près tout ce qui se passe mais il y a quelques zones grises que je veux éclaircir! Fondamentalement, je me demande ce que fait cette section du code?Android ListView Layout inflat

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.inbox_row, null); 
    } 

Cette méthode est située dans une classe qui étend ArrayAdapter. Ai-je raison de penser que c'est une forme de recyclage? pour quand les vues vont et viennent sur l'écran? ....

Toute aide est très appréciée. Merci.

+0

http://www.youtube.com/watch?v=wDBM6wVEO70. Jetez un oeil sur le lien. Votre question est probablement répondue. – Raghunandan

+1

Si vous avez trois éléments dans votre liste, et qu'il y a de l'espace sur l'écran pour trois lignes dans votre ListView, getView() sera appelé trois fois avec une vue null pour créer ces trois lignes. Vous ne pouvez pas recycler une ligne actuellement utilisée. – Raghunandan

+0

Ok, je vois, et est-ce que l'inflateur de mise en page place fondamentalement les vues sur la liste où il est dit v = vi.inflate (.layout.inbox_row, null)? – Javacadabra

Répondre

4

c'est exactement ce que vous avez dit, une forme de recyclage. Le fait d'influer sur une mise en page demande beaucoup de mémoire et beaucoup de temps. Par souci d'efficacité, le système vous passe juste à côté de l'écran et vous pouvez simplement mettre à jour son texte et ses images et les renvoyer au UI. Par exemple, si votre vue de liste affiche 6 éléments de sa liste (en raison de sa hauteur), elle ne fera que gonfler 6 éléments et pendant le défilement, elle continue de les recycler.

Il y a quelques astuces d'optimisations supplémentaires que vous devriez utiliser et je suis sûr que le lien vidéo que le commentateur a posté les expliquera.

modifier

cet exemple est un ArrayAdapter d'articles de magasin, mais vous pouvez le faire à tout ce dont vous avez besoin. l'adaptateur effectue la correspondance et la couche de séparation entre l'interface utilisateur et les données.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if (convertView == null) 
    convertView = newView(); 

    // Store is the type of this ArrayAdapter 
    Store store = getItem(position); 
    Holder h = (Holder) convertView.getTag(); 

    // And here I get the data and address them to the UI 
    // as you can see, if the convertView is not null, 
    // I'm not creating a new one, I'm just changing text, images, etc 
    h.storeName.setText(store.getStoreName()); 
    h.address.setText(store.getAddressLine1()); 
    h.postcode.setText(store.getPostCode()); 
    h.distance.setText(store.getDistance()); 

    return convertView; 
} 

// I like to separate in a different method when the convertView is null 
// but that's me being organisation obsessive 
// but it also makes easy to see which methods are only being called the 1st time 
private View newView() { 
    LayoutInflater inf = LayoutInflater.from(getContext()); 
    View v = inf.inflate(R.layout.map_result_list, null); 
    Holder h = new Holder(); 
    // here we store that holder inside the view itself 
    v.setTag(h); 

    // and only call those findById on this first start 
    h.storeName = (TextView) v.findViewById(R.id.txtLine1); 
    h.address = (TextView) v.findViewById(R.id.txtLine2); 
    h.postcode = (TextView) v.findViewById(R.id.txtLine3); 
    h.distance = (TextView) v.findViewById(R.id.txtDistance); 

    return v; 
} 

// this class is here just to hold reference to the UI elements 
// findViewById is a lengthy operation so this is one of the optimisations 
private class Holder { 
    TextView storeName; 
    TextView address; 
    TextView postcode; 
    TextView distance; 
} 
+0

Je comprends ce que vous dites. Mais quand il est appelé 6 fois et v plus == nul ce qui se passe? Ou y a-t-il plus de choses qui se passent dans les coulisses, en écoutant une vue pour aller à l'écran et en libérant un v en le réglant == sur null? – Javacadabra

+0

non non ... Je vous suggère de regarder la vidéo le gars a commenté et donnez-moi une minute, je vais mettre à jour ma réponse avec un exemple de code d'une implémentation ArrayAdapter complète correcte – Budius

+1

comme vous le voyez sur l'exemple, le v retourné est exactement le même que celui que vous avez gonflé auparavant, puis sur votre code, vous allez juste le redéfinir comme étant la vue sur l'autre position. – Budius