Was ist die Arbeit von setTag und getTag im ViewHolder pattern?
Ich habe einen einfachen code-snippet für die Umsetzung custom listview.
Mein code ist wie folgt:
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);
}
}
}
Habe ich gesehen, so viele Antworten auf SO und auf anderen Seiten und ich Verstand die recycling-Mechanismus der listview.
Verstand ich auch, dass aus den viewholder, können wir halten die untergeordneten Ansichten in den adapter, und wir haben nicht zu nennen findViewById()
viele Male. So ist es für die Optimierung.
Aber ich habe nur die Verwirrung in setTag(holder)
und getTag()
Methoden. Von dieser Frage, Kam ich zu wissen, dass es für ein Schlüssel-Wert-paar auf mehreren Objekten, so dass wir leicht auf Sie zugreifen. Aber, ich verstehe nicht, warum Sie sind hier gefragt...weil, wir haben nicht mehrere Halter Objekten...nur wir müssen uns ändern-Halterung Variablen jeder Zeit. können wir hier den code ohne Verwendung setTag
und getTag
?
kann das jemand besser erklären, was setTag
und getTag
tun "hier"?
warum nicht versuchen Sie es und sehen, was das Ergebnis ist?
Ich habe bereits versucht...ich habe nicht gestellte Frage ohne versuchen..Wenn du das weißt, dann bitte die Antwort geben
InformationsquelleAutor Fenil | 2014-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
tag
ist ein Mechanismus, um Ihrenviews
an etwas erinnern, das könnte einobject
eineinteger
einestring
oder was du willst.also, wenn Ihr
ListView
wird zum ersten mal IhreconvertView
istnull
. so erstellen Sie eine neueconvertView
und alle Ihrereferences
desobjects
desrow
imviewHolder
. dann speichern Sie IhreviewHolder
in Erinnerung, dassconvertView
(setTag).Android
nimmt IhreconvertView
es aus und legt es in seinepool
zurecycle
es undpasses
es wieder um Sie. aber seinepool
kann nicht genugconvertViews
damit es wieder geht eine neueconvertView
das istnull
. also wieder die Geschichte wiederholt, bis diepool
vonandroid
gefüllt ist. danachandroid
dauertconvertView
aus seinem pool und übergibt es dir. Sie werden feststellen, dass Ihr nichtnull
so Fragen Sie es, wo sind meine Objektreferences
, gab ich Ihnen das erste mal? (getTag) so erhalten Sie diese und tun, was Sie möchten.Mehr Ausarbeitung auf folgende Zeile
but its pool may not have enough convertViews so it again passes a new convertView thats null
android
pool
leer ist, wenn IhrlistView
erstellen. so für den ersten Punkt IhrerlistView
es sendet Ihnen eineconvertView
angezeigt werden muss. danachandroid
speichert es in seinerpool
, so seinepool
enthält jetzt nur einconvertView
. für den zweiten Artikel IhrerlistView
, wird android nicht verwenden können, Ihren pool, weil es ist eigentlich ein element und dieses element ist Ihre erste Element, und es wird gezeigt, jetzt hat es also passieren anderenconvertView
. dieser Prozess repeates bisandroid
gefundenconvertView
in seinerpool
das ist, die nicht angezeigt werden und jetzt geht es um Sie.Android bläst jeder Zeile, bis Sie den Bildschirm füllte nach, wenn Sie Blättern Sie durch die Liste es nutzt Halter.
aktualisieren Sie Blick auf es wieder
danke...kurz gesagt, die Android haben, Blasen Sie die neue Zeile layout, bis das layout passt sich der Bildschirmgröße an. nach als es nutzt den Halter, das Kind zu verändern Ansichten innerhalb der Zeile. richtig?
ok..ich verstanden..danke.
InformationsquelleAutor mmlooloo
Lässt Blick in eine Andere Perspektive:
Können sich vorstellen, dass die Hubschrauber wird die "Zeile", während die Seil wird die "setTag" und die Auto unten ist "WeatherHolder", aber der pilot des Hubschraubers ist in diesem Auto und er/Sie der ein Geschäftsführer die Steuerung des Hubschraubers über eine "KABELGEBUNDENE FERNBEDIENUNG".
Wenn Sie "cut the Rope", Die "setTag" die Hellicopter noch Fliegen, aber der pilot kann nicht mehr Steuern, da der pilot die Tropfen auf den Boden, was bedeutet, der pilot ist jetzt tot! (In java als ein Objekt Verlust der Referenz der Garbage Collector sammelt, und frei aus dem Gedächtnis).
Wenn Sie nicht platzieren oder befestigen Sie das Seil, um das Auto während der Hubschrauber ist etwa zu Fliegen, wo der Pilot sitzt - Sie potenziell den Verlust einer Kontrolle auf den Hubschrauber, weil Sie eine "KABELGEBUNDENE FERNBEDIENUNG".
Ich hoffe, dies hilft :).
InformationsquelleAutor neferpitou
Dies ist, wo Sie falsch sind - es ist ein Inhaber-per-view (aka sichtbar oder zwischengespeichert ListView-Eintrag).
Es gibt eine separate
WeatherHolder holder
für jede Ansicht.meinst du für jede Zeile. richtig?
Ja. Jede Zeile ist eine Sicht, die richtige ?
Recht. aber holder = new WeatherHolder(Zeile); genannt wird nur für die erste Zeit der inflation. (wenn converview null ist - oder wenn kein layout aufgeblasen)
InformationsquelleAutor Andrew Breen