Optimisation de l'adaptateur de base
Introduction à cette section :
Dans la section précédente, nous avons appris à utiliser un ListView et à personnaliser un simple BaseAdapter. Nous avons commencé avec le code. On peut voir deux méthodes importantes : getCount() et getView() seront appelées autant de fois qu'il y a de colonnes sur l'interface. Vous pouvez voir quelques indices à ce moment-là. Chaque fois qu'une vue est nouvellement gonflée, le XML doit être analysé. C'est un gaspillage de ressources. Bien sûr, une liste avec des dizaines ou des centaines de colonnes ne pose aucun problème, mais que se passe-t-il s'il y en a plus ou si la mise en page est plus compliquée ? Par conséquent, il est très important d'apprendre l'optimisation de ListView, et cette section est destinée à l'optimisation de BaseAdapter. Les deux points d'optimisation sont : réutiliser convertView. Et utilisez ViewHolder pour réutiliser les composants sans avoir à trouver ViewById à chaque fois. Faisons l'expérience à travers le code !
1. Réutilisez ConvertView :
Comme mentionné ci-dessus, combien d'éléments se trouvent sur l'interface, puis combien de fois la méthode getView sera-t-elle appelée ! Jetons un coup d'œil au code getView() que nous avons écrit dans la section précédente :
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txt_aName = ( TextView) convertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
img_icon.setBackgroundResource(mData.get(position). getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak.setText(mData.get(position).getaSpeak());
return convertView;
}
Oui, inflate() charge XML à chaque fois. En fait, ce convertView est une vue fournie par le système pour que nous puissions la consommer. objet cache, puis asseyez-vous et jugez. Modifiez le code optimisé :
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
}
ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
TextView txt_aSpeak = (TextView) convertView.findViewById(R. id.txt_aSpeak) ;
img_icon.setBackgroundResource(mData.get(position).getaIcon());
txt_aName.setText(mData.get(position).getaName());
txt_aSpeak .setText(mData .get(position).getaSpeak());
return convertView;
}
2. Les composants de réutilisation de ViewHolder
Hé, getView() sera appelé plusieurs fois, donc findViewById devra être appelé plusieurs fois, et l'élément de notre ListView Généralement la disposition est la même. Nous pouvons optimiser cette partie en définissant nous-mêmes une classe ViewHolder. Effectuez une optimisation des performances ! Le code modifié est le suivant :
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderholder = null;
if ( convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
holder = new ViewHolder();
holder.img_icon = ( ImageView ) convertView.findViewById(R.id.img_icon);
holder.txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
holder.txt_aSpeak = (TextView) convertView.findViewById(R. id .txt_aSpeak);
convertView.setTag(holder); //Stocker le support dans convertView
}else{
holder = (ViewHolder) convertView.getTag();
}
titulaire . img_icon.setBackgroundResource(mData.get(position).getaIcon());
holder.txt_aName.setText(mData.get(position).getaName());
holder.txt_aSpeak.setText(mData.get ( position).getaSpeak());
return convertView;
}
classe statique ViewHolder{
ImageView img_icon;
TextView txt_aName;
TextView txt_aSpeak;
}
Oui, c'est aussi simple que cela. Vous pourrez simplement écrire BaseAdapter selon ce modèle à l'avenir, haha, et celui-ci modifie ViewHolder. static, qu'il soit défini comme static n'a rien à voir avec le nombre d'objets qu'il contient. Static est ajouté pour l'utiliser à plusieurs endroits. Lorsque vous utilisez Holder, la classe ne doit être chargée qu'une seule fois. Si elle n'est utilisée qu'une seule fois, peu importe qu'elle soit ajoutée ou non ! ——Mots originaux de Berial (Dieu B)~
Résumé de cette section :
D'accord, à propos de l'optimisation de BaseAdapter Le les deux ci-dessus sont très simples, réutilisant ConvertView et ViewHolder personnalisé Réduisez les appels à findViewById()~ Si vous avez d'autres suggestions d'optimisation de BaseAdapter, n'hésitez pas à les faire, merci~