2017-05-27 1 views
-4

Quelqu'un peut-il expliquer le rôle individuel de convertView et de View Holder Pattern dans ListView, et comment ils ont augmenté l'efficacité de listview?Expliquer le rôle individuel de convertView et de View Holder Pattern dans ListView

private class PersonsAdapter extends ArrayAdapter<Person> { 

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

     ViewHolder holder; 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_entry, null); 
      holder = new ViewHolder(); 
      holder.nameTextView = (TextView) convertView.findViewById(R.id.person_name); 
      holder.surnameTextView = (TextView) convertView.findViewById(R.id.person_surname); 
      holder.personImageView = (ImageView) convertView.findViewById(R.id.person_image); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     Person person = getItem(position); 

     holder.nameTextView.setText(person.getName()); 
     holder.surnameTextView.setText(person.getSurname()); 
     //holder.personImageView.setImageBitmap(person.getImage()); 

     return convertView; 
    } 
} 

Répondre

0
  • convertView

c'est une vue qui a déjà été gonflé (quand convertView==null) et était à l'écran, mais maintenant ont fait défiler sur l'écran, de sorte que vous pouvez réutiliser pour afficher les données de la vue qui va bientôt entrer dans l'écran.

améliore les performances en réduisant le gonflement de la vue (les appels à inflater.inflate sont coûteux), réduit la récupération de place et réduit l'allocation de mémoire.

  • vue titulaire

conserve une référence directe à votre point de vue.

améliore potentiellement les performances car findViewById est une boucle for faisant le tour de la hiérarchie de vue qui peut potentiellement ronger le temps précieux du thread de l'interface utilisateur. Cette amélioration peut être minime, mais dans une liste de défilement rapide, chaque nano-seconde compte pour avoir un joli smoth 60fps.

+0

merci c'est génial! –

0

Il ya beaucoup de messages à ce sujet dans SO. Mais en bref, il s'agit de réutiliser des objets dans ListView au lieu d'en instancier de nouveaux. Dans un ListView, il y a un nombre fixe d'éléments à l'écran. Ainsi, lorsque vous percevez un nouvel objet à partir du bas, un élément précédent disparaît du haut. La conversionview est donc l'objet qui stocke les données qui disparaissent et que vous pouvez réutiliser pour stocker les nouvelles données entrantes.

Si converView est nul, vous devez créer une nouvelle vue pour stocker les données entrantes. Si ce n'est pas null, vous pouvez le réutiliser pour de nouvelles données au lieu de créer une nouvelle vue.