Quel est le fonctionnement de setTag et getTag dans le pattern ViewHolder?
J'ai un simple extrait de code pour la mise en œuvre personnalisée listview.
Mon code est comme suit:
WeatherAdapter.java :
public class WeatherAdapter extends ArrayAdapter<weather>{
Context mcontext;
int mlayoutResourceId;
weather mdata[] = null;
View row;
public WeatherAdapter(Context context, int layoutResourceId, weather[] data) {
super(context, layoutResourceId, data);
mlayoutResourceId = layoutResourceId;
mcontext = context;
mdata = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
row = convertView;
WeatherHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ( (Activity) mcontext).getLayoutInflater();
row = inflater.inflate(mlayoutResourceId, parent, false);
holder = new WeatherHolder(row);
row.setTag(holder);
}
else
{
holder = (WeatherHolder)row.getTag();
}
weather w = mdata[position];
holder.txtTitle.setText(w.mtitle);
holder.imgIcon.setImageResource(w.micon);
return row;
}
WeatherHolder.java:
class WeatherHolder
{
ImageView imgIcon;
TextView txtTitle;
public WeatherHolder(View v){
imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
txtTitle = (TextView)row.findViewById(R.id.txtTitle);
}
}
}
J'ai vu tellement de nombreuses réponses sur soi et sur d'autres sites et j'ai compris le recyclage mécanisme de contrôle listview.
J'ai aussi compris qu'à partir de viewholder, nous pouvons maintenir l'enfant vues sur l'adaptateur et nous n'avons pas à appeler findViewById()
de nombreuses fois. Donc, c'est à des fins d'optimisation.
Mais j'ai seulement la confusion dans setTag(holder)
et getTag()
méthodes. À partir de cette questionJe suis venu pour savoir que c'est pour faire une paire clé-valeur sur plusieurs objets, de sorte que nous puissions y avoir accès facilement. Mais, je ne comprends pas pourquoi ils sont nécessaires ici...parce que, nous n'avons pas plusieurs objets titulaire...que nous avons pour le changement du titulaire de variables à chaque fois. pouvons-nous le code ici sans l'aide de setTag
et getTag
?
quelqu'un peut-il expliquer mieux que setTag
et getTag
faire "ici"?
source d'informationauteur Fenil
Vous devez vous connecter pour publier un commentaire.
tag
est un mécanisme pour rendre votreviews
souvenir de quelque chose qui pourrait être unobject
uninteger
unstring
ou tout ce que vous voulez.ainsi, lorsque votre
ListView
va créer pour la première fois votreconvertView
estnull
. ainsi, vous créez un nouveauconvertView
et de mettre tous vosreferences
de laobjects
derow
dans unviewHolder
. puis enregistrez votreviewHolder
dans la mémoire de quiconvertView
(setTag).Android
prend votreconvertView
et la met dans sapool
àrecycle
etpasses
il de nouveau à vous. mais sonpool
peut ne pas avoir assezconvertViews
donc de nouveau passe un nouveauconvertView
c'estnull
. encore une fois l'histoire se répète jusqu'à lapool
deandroid
est rempli. après queandroid
prend unconvertView
de sa piscine et il passe pour vous. vous trouverez que ce n'est pasnull
si vous lui demander où sont mes objetreferences
que je t'ai donné pour la première fois? (getTag), de sorte que vous obtiendrez ces et faire ce que vous voulez.Une élaboration plus poussée sur les dessous de la ligne
but its pool may not have enough convertViews so it again passes a new convertView thats null
android
pool
est vide lorsque votrelistView
va créer. donc, pour le premier article de votrelistView
il vous envoie unconvertView
qui doivent être affichées. après queandroid
l'enregistre dans sonpool
de sorte que sonpool
contient maintenant juste unconvertView
. pour votre deuxième article de votrelistView
qui va créer des android ne peut pas utiliser sa piscine car il est en fait a un élément et l'élément est votre premier article et il est montré en ce moment donc il doit passer un autreconvertView
. ce processus repeates jusqu'àandroid
trouvé unconvertView
dans sonpool
ce n'est pas affichée maintenant, et il passe pour vous.Android gonfle chaque ligne jusqu'à l'écran rempli après cela, lorsque vous faites défiler la liste qu'il utilise titulaire.
Vous permet de Regarder dans une autre Perspective:
Permet d'imaginer que le Hélicoptère est le "ligne", tandis que le corde est le "setTag" et le voiture ci-dessous est "WeatherHolder", mais le pilote de l'Hélicoptère est à l'intérieur de la voiture et il/elle le un gestion le contrôle de l'hélicoptère à l'aide d'une "TÉLÉCOMMANDE FILAIRE".
Lorsque vous coupez la Corde Qui est "setTag" la Hellicopter encore voler, mais le pilote ne peut plus le contrôler depuis le pilote, c'est une goutte dans le sol, ce qui signifie que le pilote est mort! (En java lorsqu'une perte d'objet de référence le Garbage Collector de recueillir et libre de la mémoire).
Lorsque vous n'avez pas la place ou attacher la corde à la voiture pendant que l'Hélicoptère est sur le point de voler où le Pilote est assis - vous potentiellement une perte de contrôle sur l'hélicoptère parce que vous êtes à l'aide de "TÉLÉCOMMANDE FILAIRE".
J'espère que cela aide :).
C'est là que vous avez tort - il y a un titulaire par affichage (aka visible ou mis en cache ListView entrée).